Apache camel 骆驼生产模板与春季JMS模板
我正在使用camel将消息发送到IBMMQQueue。 侦听此队列的MDB需要com.ibm.jms.JMSMapMessage类型的消息 当我使用camel-producerTemplate时,会抛出一个异常。 我正在这样做 sendBody(“wmq:queue”,hashMap) 所以我尝试了SpringJMSTemplate,它成功了Apache camel 骆驼生产模板与春季JMS模板,apache-camel,ibm-mq,spring-jms,Apache Camel,Ibm Mq,Spring Jms,我正在使用camel将消息发送到IBMMQQueue。 侦听此队列的MDB需要com.ibm.jms.JMSMapMessage类型的消息 当我使用camel-producerTemplate时,会抛出一个异常。 我正在这样做 sendBody(“wmq:queue”,hashMap) 所以我尝试了SpringJMSTemplate,它成功了 jmsTemplate.send(new MessageCreator() { @Override pub
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似乎更加优雅,至少就我的单元测试而言似乎我误解了classcast异常消息。Camel正确地发送了com.ibm.jms.JMSMapMessage,消费者应用程序中的MDB需要javax.jms.ObjectMessage。
我通过在端点URI中设置
jmsMessageType=object
解决了这个问题: 只需将hashmap序列化为json,然后将其作为正文发送即可。然后可以将其转换为任何类型。您使用哪种版本的Camel?您可以尝试将?jmsMessageType=Map
设置为camel producer模板中端点uri的参数。为了确保作为消息正文发送的hashMap实例是java.util.Map
实例,我使用的是2.20.1,我显式地设置了jmsMessageType=Map,首先是作为选项,其次是在标头中。为了实现后者,我创建了一个路由,从(“direct:start”).setHeader()到(wmq),并使用producerTemplate将发送体发送到此路由
jmsTemplate.send(new MessageCreator() {
@Override
public Message createMessage(Session session)
throws JMSException {
return session.createObjectMessage((Serializable) sctHmap);
}
});