当我使用 Spring 和 MQ Queue 发送 OBject 消息时,为什么会收到 JMSBytesMessage

问题描述 投票:0回答:2

所以我使用 Spring 和 IBM MQ Queue 发送一个对象:

public void sendObjectMessage(final Object message) {

//  jmsTemplate.convertAndSend(message);

    jmsTemplate.send(new MessageCreator()
      {
        public Message createMessage(Session session) throws JMSException
        {
        ObjectMessage outMessage = session.createObjectMessage((Serializable) message);
        return(outMessage);
        }
      }); 
}

在调试过程中,我可以看到我确实将其作为对象消息发送。但是使用 Spring 的监听器实现,我在 onMessage() 方法中获取消息作为 JMSBytesMessages??????

public void onMessage(Message message) {
    System.out.println(">>>>>>> Recieved in onMessage");
    System.out.println(message.getClass());
}

输出:

>>>>>>> Recieved in onMessage
class com.ibm.jms.JMSBytesMessage

有人知道这是怎么回事吗?这很难调试,因为它似乎发生在队列上???

感谢您的帮助

P.S 我也尝试过使用

来捕获消息
if (message instanceof ObjectMessage) {
    object = ((ObjectMessage) message).getObject();
}

if (message instanceof JMSBytesMessage) {
    System.out.println("ITS A BYTES MESSAGE!!!!!!!!!!!"); 
}

两者都不起作用???

java spring jms ibm-mq
2个回答
3
投票

我的第一个猜测是,您正在使用WebSphere AppServer,并且您的JMS队列对象(在JNDI中)被配置为本机MQ系列客户端,即您创建一个JMSObjectMessage并将其移交给会话,然后MQSeries认为它已经转换为 BytesMessage。


3
投票

我也有同样的问题。就我而言,我使用了错误的运输类型:

<bean id="mqQueue" class="com.ibm.mq.jms.MQQueue">
    <property name="baseQueueName" value="..." />
    <property name="targetClient">
        <util:constant static-field="com.ibm.mq.jms.JMSC.MQJMS_CLIENT_NONJMS_MQ" />
    </property>
</bean>

它应该是:

<bean id="mqQueue" class="com.ibm.mq.jms.MQQueue">
    <property name="baseQueueName" value="..." />
    <property name="targetClient">
        <util:constant static-field="com.ibm.mq.jms.JMSC.MQJMS_CLIENT_JMS_COMPLIANT" />
    </property>
</bean>
© www.soinside.com 2019 - 2024. All rights reserved.