Apache camel 骆驼生产模板与春季JMS模板

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

我正在使用camel将消息发送到IBMMQQueue。 侦听此队列的MDB需要com.ibm.jms.JMSMapMessage类型的消息

当我使用camel-producerTemplate时,会抛出一个异常。 我正在这样做 sendBody(“wmq:queue”,hashMap)

所以我尝试了SpringJMSTemplate,它成功了

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);
            }
        });