问题描述
我正在尝试连接到 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
基本上,当我们尝试将消息从 Spring JMS 模板发布到 IBM MQ 时,会话在其他区域变为空。
来自java,
public void sendNotificationsMessageToQueue(String jsonMessage)
{
jmsTemplate(Queue,new MessageCreator(){
@Override public Message createMessage(Session session) throws JMSException
{
return session.createTextMessage(jsonMessage);
} });
来自 XML:
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="ibmConnectionFactory" />
<property name="defaultDestination" ref="exQueue" />
</bean>
解决方法
将此作为评论而不是答案阅读。这是一个很长的评论,需要一些格式。
您的 XML 还应该定义一个 ibmConnectionFactory
bean,它将指向 IBM MQ Factory 类。里面的东西很重要。您需要分享这一点,因为这似乎是您部署的代码失败的地方。
我猜这不是 Spring-Boot 项目,而且您没有使用 mq-jms-spring-boot-starter。
如果您当时正在定义 jmsTemplate
和 ibmConnectionFactory
bean,这有点奇怪。如果 IBM MQ 类是 spring-boot 项目中定义的唯一消息传递类,那么 spring 将自动将 IBM MQ 连接类绑定到默认的 jmsTemplate
bean。
如果您在项目中将其他 Messaging 类定义为依赖项,那么您的 bean 将忽略它们,这表明它们不需要,因此不应该存在。
但是,如果您使用的是 Spring-Boot 和 mq-jms-spring-boot-starter,那么我发现在 Java 代码中定义 bean 比在 XML 中更容易,尽管您只在更改默认值时才需要.
import com.ibm.mq.jms.MQConnectionFactory;
import com.ibm.mq.samples.jms.spring.globals.handlers.OurDestinationResolver;
import com.ibm.mq.samples.jms.spring.globals.handlers.OurMessageConverter;
import com.ibm.mq.spring.boot.MQConfigurationProperties;
import com.ibm.mq.spring.boot.MQConnectionFactoryFactory;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jms.core.JmsTemplate;
import javax.jms.JMSException;
@Configuration
public class MQConfiguration114 {
protected final Log logger = LogFactory.getLog(getClass());
@Bean
public MQConnectionFactory mqConnectionFactory() throws JMSException {
MQConfigurationProperties properties = new MQConfigurationProperties();
// Properties will be a mix of defaults,and those found in application.properties
// under ibm.mq
// Here we can override any of the properties should we need to
MQConnectionFactoryFactory mqcff = new MQConnectionFactoryFactory(properties,null);
MQConnectionFactory mqcf = mqcff.createConnectionFactory(MQConnectionFactory.class);
return mqcf;
}
@Bean("myJmsTemplate")
public JmsTemplate myJmsTemplate() throws JMSException {
JmsTemplate jmsTemplate = new JmsTemplate(mqConnectionFactory());
// Any other customisations necessary go here.
// ...
return jmsTemplate;
}
}
,
它在删除 spring jms 模板并编写用于获取 IBM MQ 连接的新类后工作。
,我们遇到了同样的问题。
它与读取配置无关,而是与 dd-java-agent.jar 相关。 0.82.0 版本导致了这个问题。我们迁移到 0.84.0 并解决了问题!