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

问题描述

我正在尝试连接到 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。

如果您当时正在定义 jmsTemplateibmConnectionFactory 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 并解决了问题!

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...