Websphere 无法将消息发布到IBM MQ队列

Websphere 无法将消息发布到IBM MQ队列,websphere,ibm-mq,spring-jms,jmstemplate,Websphere,Ibm Mq,Spring Jms,Jmstemplate,我正在尝试连接到IBM MQ并发布消息。获得以下异常,但相同的代码在开发环境中工作 org.springframework.jms.connection.SingleConnectionFactory.createSession(SingleConnectionFactory.java:437) com.ibm.mq.jms.MQQueueConnection.createSession(MQQueueConnection.java:154) ~[com.ibm.mq.allclient-9.0

我正在尝试连接到IBM MQ并发布消息。获得以下异常,但相同的代码在开发环境中工作

org.springframework.jms.connection.SingleConnectionFactory.createSession(SingleConnectionFactory.java:437)
com.ibm.mq.jms.MQQueueConnection.createSession(MQQueueConnection.java:154) ~[com.ibm.mq.allclient-9.0.4.0.jar:9.0.4.0 - p904-L171030.1
com.ibm.mq.jms.MQQueueConnection.createQueueSession(MQQueueConnection.java:130) ~[com.ibm.mq.allclient-9.0.4.0.jar:9.0.4.0 - p904-L171030.1]
com.ibm.mq.jms.MQQueueSession.<init>(MQQueueSession.java:58) ~[com.ibm.mq.allclient-9.0.4.0.jar:9.0.4.0 - p904-L171030.1]
com.ibm.mq.jms.MQSession.<init>(MQSession.java:262) ~[com.ibm.mq.allclient-9.0.4.0.jar:9.0.4.0 - p904-L171030.1]\\n\
com.ibm.mq.jms.MQSession.getTransacted(MQSession.java:876) ~[com.ibm.mq.allclient-9.0.4.0.jar:9.0.4.0 - p904-L171030.1]
Caused by: java.lang.NullPointerException
从XML:


将此作为注释而不是答案阅读。这是一条很长的注释,需要一些格式

您的XML还应该定义一个
ibmConnectionFactory
bean,该bean将指向IBM MQ工厂类。里面的东西很重要。您需要分享这一点,因为这似乎是您部署的代码失败的地方

我猜这不是一个Spring引导项目,您也没有使用mq jms Spring引导启动器

如果您当时正在定义
jmsTemplate
ibmConnectionFactory
bean,那就有点奇怪了。如果IBM MQ类是spring引导项目中定义的唯一消息传递类,那么spring将自动将IBM MQ连接类绑定到默认的
jmsTemplate
bean

如果在项目中有其他消息传递类定义为依赖项,那么bean将忽略它们,这表明它们不需要,因此不应该存在

但是,如果您使用的是Spring Boot和mq jms Spring Boot starter,那么我发现在Java代码中定义bean比在XML中定义bean更容易,尽管只有在更改默认值时才需要这样做

import com.ibm.mq.jms.MQConnectionFactory;
导入com.ibm.mq.samples.jms.spring.globals.handlers.OurDestinationResolver;
导入com.ibm.mq.samples.jms.spring.globals.handlers.OurMessageConverter;
导入com.ibm.mq.spring.boot.MQConfigurationProperties;
导入com.ibm.mq.spring.boot.MQConnectionFactoryFactory;
导入org.apache.commons.logging.Log;
导入org.apache.commons.logging.LogFactory;
导入org.springframework.context.annotation.Bean;
导入org.springframework.context.annotation.Configuration;
导入org.springframework.jms.core.JmsTemplate;
导入javax.jms.jmsception;
@配置
公共类MQConfiguration114{
受保护的最终日志记录器=LogFactory.getLog(getClass());
@豆子
公共MQConnectionFactory MQConnectionFactory()引发JMSExException{
MQConfigurationProperties=新的MQConfigurationProperties();
//属性将混合使用默认值和application.Properties中的默认值
//在ibm.mq下
//在这里,如果需要,我们可以覆盖任何属性
MQConnectionFactoryFactory mqcff=新MQConnectionFactoryFactory(属性,null);
MQConnectionFactory mqcf=mqcff.createConnectionFactory(MQConnectionFactory.class);
返回mqcf;
}
@Bean(“myJmsTemplate”)
公共JmsTemplate myJmsTemplate()抛出JMSException{
JmsTemplate JmsTemplate=新的JmsTemplate(mqConnectionFactory());
//任何其他必要的定制都可以到这里来。
// ...
返回jmsTemplate;
}
}

在删除spring jms模板并编写新类以获得IBM MQ连接后,它工作了。

请分享您的代码这与开发环境有什么不同?如果代码相同,那么差异可能在于配置。@chughts-configuration一切都是一样的。它对开放jdk版本和MQ JMS版本有什么作用吗?谢谢您的评论。我不使用spring引导,但是spring(包括allclients.jar v8.0.04和tracecontrol for IBM config和jmstemplate to connect.v8)不受支持。8.0.0.4也非常古老。为什么不使用9.2.0.2或9.1.0.8?这段代码在我的开发区域也可以使用,但在测试区域和生产环境中,它会中断,这是因为我们在测试和生产环境中读取配置的方式。我们使用helm+yml+configmap配置来获取属性值OSHMC-也尝试了最新的JAR,但没有成功。如果代码在一个环境中工作,而不是在另一个环境中工作,那么环境和相应的配置是不同的。因此,这可能是由于如何获取配置属性。