【问题标题】:Camel ProducerTemplate versus Spring JMSTemplateCamel ProducerTemplate 与 Spring JMSTemplate
【发布时间】: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


【解决方案1】:

看来我误解了 classcast 异常消息。 Camel 正确发送 com.ibm.jms.JMSMapMessage,消费者应用程序的 MDB 期待 javax.jms.ObjectMessage。 我通过在端点 URI 中设置 jmsMessageType=object 来解决它。 :)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-26
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多