连接到 Websphere Mq 时出现问题
Issue in connecting to Websphere Mq
我正在使用 spring jms 连接到 Websphere MQ。
Connection names (all as an example): hostname: <Websphere ip address> http://localhost:9043
given hostname 12.123.0.12
In Resources->JMS->Queue connection Factories
name: MQDemo
JNDI name: MQDemo
2 Queues:
name: MQ.T11.UPDATE.REQUEST
JNDI name: jms/MQ.T11.UPDATE.REQUEST
name: MQ.T11.INQUIRY.REPLY
JNDI name: jms/MQ.T11.UPDATE.REQUEST
DemoMain.java
在主要方法中:
ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
// get bean from context
JmsMessageSender jmsMessageSender = (JmsMessageSender)ctx.getBean("jmsMessageSender");
// send to default destination
jmsMessageSender.send();
JMSMessageSender.java
package name: com.java.geek
@Autowired
private JmsTemplate jmsTemplate;
/**
* send text to default destination
* @param text
*/
@Cacheable("message")
public void send() {
System.out.println("in send");
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session)throws JMSException {
System.out.println("in create message");
Message message = (Message) session.createTextMessage("Hello JMS");
return message;
}
});
}
public JmsTemplate getJmsTemplate()
{
return jmsTemplate;
}
public void setJmsTemplate(JmsTemplate jmsTemplate)
{
this.jmsTemplate = jmsTemplate;
}
应用-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.java.geek" />
<bean id="amqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>http://localhost:9043</value>
</property>
<property name="port">
<value>1415</value>
</property>
<property name="queueManager">
<value>MQDemo</value>
</property>
<property name="transportType">
<value>1</value>
</property>
</bean>
<!-- Pooled Spring connection factory -->
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
<property name="MQDemo" value="java:comp/env/jms/MQDemo" />
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.jms.QueueConnectionFactory"/>
<constructor-arg ref="amqConnectionFactory" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory"><ref bean="amqConnectionFactory" /> </property>
<property name="pubSubDomain"><value>false</value></property>
<!-- <property name="defaultDestination"><ref bean="senderQueue" /></property> -->
</bean>
<!-- ======================================================= -->
<!-- JMS Send, define default destination and JmsTemplate -->
<!-- ======================================================= -->
<!-- Default Destination Queue Definition -->
<bean id="senderQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="TEST" />
<property name="MQ.T11.UPDATE.REQUEST" value="java:comp/env/jms/MQ.T11.UPDATE.REQUEST" />
</bean>
<bean id="jmsMessageSender" class="com.java.geek.JmsMessageSender">
<property name="jmsTemplate"><ref bean="SenderJMSTemplate"/></property>
</bean>
</beans>
我收到一个错误,
"Error creating bean with name 'jmsMessageSender': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jms.core.JmsTemplate com.shengwang.demo.JmsMessageSender.jmsTemplate;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory' defined in class path resource [app-context.xml]:
Cannot resolve reference to bean 'amqConnectionFactory' while setting constructor argument;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'amqConnectionFactory' defined in class path resource [app-context.xml]: Instantiation of bean failed;
nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ibm.mq.jms.MQQueueConnectionFactory]: Constructor threw exception;
nested exception is java.lang.NoClassDefFoundError: com/ibm/disthub2/impl/client/SessionConfig
还有另一个错误,SAXException
。
我无法连接到 Websphere MQ。请指出代码中的错误。
NoClassDefFoundError 表明编译器能够找到 class 但运行时进程找不到。
我建议您的运行时 class路径中可能缺少某些内容。尝试将其与您的 build/compile class 路径进行比较。
我会说你需要检查你的代码是 运行ning 的盒子上是否正确安装了 MQ 客户端。只复制 WMQ jar 并期望它能工作是一个常见的错误。您的代码将构建,但您将从 MQ 类 中准确地获得这种 NoClassDefFound。虽然您最终可能会在运行的 IBM 安装中追逐每个 jar,但它不会受到支持(参见 http://www-01.ibm.com/support/docview.wss?uid=swg21376217)
获取 WMQ 安装介质并运行在您使用的机器上安装。然后 运行 通过 IBM 的 "Getting Started" 以确保其正常运行。
我正在使用 spring jms 连接到 Websphere MQ。
Connection names (all as an example): hostname: <Websphere ip address> http://localhost:9043
given hostname 12.123.0.12
In Resources->JMS->Queue connection Factories
name: MQDemo
JNDI name: MQDemo
2 Queues:
name: MQ.T11.UPDATE.REQUEST
JNDI name: jms/MQ.T11.UPDATE.REQUEST
name: MQ.T11.INQUIRY.REPLY
JNDI name: jms/MQ.T11.UPDATE.REQUEST
DemoMain.java
在主要方法中:
ApplicationContext ctx = new ClassPathXmlApplicationContext("app-context.xml");
// get bean from context
JmsMessageSender jmsMessageSender = (JmsMessageSender)ctx.getBean("jmsMessageSender");
// send to default destination
jmsMessageSender.send();
JMSMessageSender.java
package name: com.java.geek
@Autowired
private JmsTemplate jmsTemplate;
/**
* send text to default destination
* @param text
*/
@Cacheable("message")
public void send() {
System.out.println("in send");
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session)throws JMSException {
System.out.println("in create message");
Message message = (Message) session.createTextMessage("Hello JMS");
return message;
}
});
}
public JmsTemplate getJmsTemplate()
{
return jmsTemplate;
}
public void setJmsTemplate(JmsTemplate jmsTemplate)
{
this.jmsTemplate = jmsTemplate;
}
应用-context.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.java.geek" />
<bean id="amqConnectionFactory" class="com.ibm.mq.jms.MQQueueConnectionFactory">
<property name="hostName">
<value>http://localhost:9043</value>
</property>
<property name="port">
<value>1415</value>
</property>
<property name="queueManager">
<value>MQDemo</value>
</property>
<property name="transportType">
<value>1</value>
</property>
</bean>
<!-- Pooled Spring connection factory -->
<bean id="connectionFactory" class="org.springframework.jndi.JndiObjectFactoryBean" lazy-init="true">
<property name="MQDemo" value="java:comp/env/jms/MQDemo" />
<property name="lookupOnStartup" value="false"/>
<property name="cache" value="true" />
<property name="proxyInterface" value="javax.jms.QueueConnectionFactory"/>
<constructor-arg ref="amqConnectionFactory" />
</bean>
<!-- JmsTemplate Definition -->
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory"><ref bean="amqConnectionFactory" /> </property>
<property name="pubSubDomain"><value>false</value></property>
<!-- <property name="defaultDestination"><ref bean="senderQueue" /></property> -->
</bean>
<!-- ======================================================= -->
<!-- JMS Send, define default destination and JmsTemplate -->
<!-- ======================================================= -->
<!-- Default Destination Queue Definition -->
<bean id="senderQueue" class="com.ibm.mq.jms.MQQueue">
<constructor-arg value="TEST" />
<property name="MQ.T11.UPDATE.REQUEST" value="java:comp/env/jms/MQ.T11.UPDATE.REQUEST" />
</bean>
<bean id="jmsMessageSender" class="com.java.geek.JmsMessageSender">
<property name="jmsTemplate"><ref bean="SenderJMSTemplate"/></property>
</bean>
</beans>
我收到一个错误,
"Error creating bean with name 'jmsMessageSender': Injection of autowired dependencies failed;
nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire field: private org.springframework.jms.core.JmsTemplate com.shengwang.demo.JmsMessageSender.jmsTemplate;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'connectionFactory' defined in class path resource [app-context.xml]:
Cannot resolve reference to bean 'amqConnectionFactory' while setting constructor argument;
nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'amqConnectionFactory' defined in class path resource [app-context.xml]: Instantiation of bean failed;
nested exception is org.springframework.beans.BeanInstantiationException: Could not instantiate bean class [com.ibm.mq.jms.MQQueueConnectionFactory]: Constructor threw exception;
nested exception is java.lang.NoClassDefFoundError: com/ibm/disthub2/impl/client/SessionConfig
还有另一个错误,SAXException
。
我无法连接到 Websphere MQ。请指出代码中的错误。
NoClassDefFoundError 表明编译器能够找到 class 但运行时进程找不到。
我建议您的运行时 class路径中可能缺少某些内容。尝试将其与您的 build/compile class 路径进行比较。
我会说你需要检查你的代码是 运行ning 的盒子上是否正确安装了 MQ 客户端。只复制 WMQ jar 并期望它能工作是一个常见的错误。您的代码将构建,但您将从 MQ 类 中准确地获得这种 NoClassDefFound。虽然您最终可能会在运行的 IBM 安装中追逐每个 jar,但它不会受到支持(参见 http://www-01.ibm.com/support/docview.wss?uid=swg21376217)
获取 WMQ 安装介质并运行在您使用的机器上安装。然后 运行 通过 IBM 的 "Getting Started" 以确保其正常运行。