我使用camel将消息发送到IBM MQQueue。 侦听此队列的MDB需要com.ibm.jms.JMSMapMessage类型的消息。
当我使用camel producerTemplate时,会抛出异常。 我这样做 producerTemplate.sendBody(" WMQ:队列",HashMap中);
Exception data: java.lang.ClassCastException: com.ibm.jms.JMSMapMessage incompatible with javax.jms.ObjectMessage
所以我尝试了Spring jmsTemplate,它起作用了。
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session)
throws JMSException {
return session.createObjectMessage((Serializable) sctHmap);
}
});
问题: jms组件文档说
它使用Spring的JMS支持声明式事务,包括 Spring用于发送的JmsTemplate和用于的MessageListenerContainer 耗时。
我尝试使用mapJmsMessage = false禁用camels自动转换。 我意识到它没有帮助,因为它会发送一个哈希映射,我仍然有相同的例外。有没有什么方法可以让producerTemplate以与JMSTemplate相同的方式工作? ProducerTemplate似乎更优雅,至少就我的单元测试而言
答案 0 :(得分:1)
似乎我误解了classcast异常消息。 Camel正在发送com.ibm.jms.JMSMapMessage,消费者应用程序的MDB期待javax.jms.ObjectMessage。
我通过在端点URI中设置jmsMessageType=object
来解决它。 :)