Apache Camel如何正确处理JMSReplyTo?骆驼何时隐式利用目的地?

时间:2019-06-02 11:05:58

标签: java spring-boot apache-camel activemq jms-topic

我使用spring-camel构建了一条路由,该路由从JMS主题使用(预期为每个输入消息设置JMSReplyTo),将消息拆分为较小的块,将其发送到REST处理器,然后汇总答案并应产生一条输出消息到JMSReplyTo指向的目标。不幸的是,骆驼在其中一个中间步骤(生成未编组的POJO)中隐式地利用了JMSReplyTo目标。

我们具有适应JMSReplyTo的功能需求,以便提供请求-答复消息传递服务。 我能够在结束路由之前读取JMSReplyTo标头,并将其显式转换为CamelJmsDestinationName,它成功覆盖了JMS组件的目标并在输出主题上生成了消息。我不确定这是否是最好的方法,问题是骆驼仍然独自使用JMSReplyTo。

我的RouteBuilder配置如下:

from("jms:topic:T.INPUT")
.process(requestProcessor)
.unmarshal().json(JsonLibrary.Jackson, MyRequest.class)
.split(messageSplitter)
.process(restProcessor)
.aggregate(messagesAggregator)
.unmarshal().json(JsonLibrary.Jackson, BulkResponses.class)
.process(responseProcessor)
.to("jms:topic:recipientTopic");

T.INPUT是输入主题的名称,而accepterTopic只是一个占位符,将由CamelJmsDestinationName代替。

我不喜欢在路由配置中使用CamelJmsDestinationName和某种模拟的主题名称,因此我愿意寻找更好的解决方案。如果骆驼自动利用JMSReplyTo产生输出消息到输出主题,那就太好了。

当前,问题在于骆驼在JMSReplyTo主题上产生中间输出,但输出是未编组的MyRequest对象,这导致异常消息“ ClassNotFoundException :(程序包名称).MyRequest”,这很明显,因为这是仅用于内部处理的类-我不想将其用于输出主题。似乎Camel确实在requestProcessor和messageSplitter处理之间隐式使用了JMSReplyTo目标...为什么?我究竟做错了什么?最佳做法是什么?

1 个答案:

答案 0 :(得分:0)

在端点中使用“ disableReplyTo = true”。骆驼不会尝试使用任何回复选项。

请参阅:https://camel.apache.org/jms.html,以获取更多详细信息