【发布时间】:2018-07-23 19:20:04
【问题描述】:
我正在使用骆驼向 IBM MQQueue 发送消息。 侦听此队列的 MDB 需要 com.ibm.jms.JMSMapMessage 类型的消息。
当我使用camel producerTemplate 时,会抛出异常。 我正在这样做 producerTemplate.sendBody("wmq:queue",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 禁用骆驼自动转换。 我意识到这无济于事,因为它会发送一个哈希映射,但我仍然遇到同样的异常。有什么方法可以让 producerTemplate 以与 JMSTemplate 相同的方式工作? ProducerTemplate 似乎更优雅,至少在我的单元测试方面
【问题讨论】:
-
只需将您的 hashmap 序列化为 json,然后将其作为正文发送。然后可以将其转换为任何类型
-
你使用什么版本的骆驼?您可以尝试将
?jmsMessageType=Map设置为骆驼生产者模板中端点 uri 的参数。 -
为了确保您作为消息正文发送的 hashMap 实例是
java.util.Map实例? -
我使用的是 2.20.1,我明确设置了 jmsMessagetype=Map,第一个作为选项,第二个在标题中。为了实现后者,我创建了一个路由 from("direct:start").setHeader().to(wmq) 并使用 producerTemplate 将Body 发送到该路由
标签: apache-camel ibm-mq spring-jms