使用spring-camel,我构建了一个从JMS主题消费的路由(期望为每个输入消息设置JMSReplyTo),将消息拆分为更小的块,将它们发送到REST处理器,然后聚合答案,并应该生成一个输出消息到JMSReplyTo指向的目的地。camel隐式地在其中一个中间步骤中使用JMSReplyTo目的地(生成一个解组的POJO)。
我们需要修改JMSReplyTo以提供请求-回复消息传递服务,我可以在结束路由之前读取JMSReplyTo头,并将其显式转换为CamelJmsDestinationName。它成功地覆盖了JMS组件的目的地,并在输出主题上生成了消息。我不确定这是否是最好的方法,问题是camel仍然自己使用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是输入主题的名称,而recipientTopic只是一个将被CamelJmsDestinationName替换的占位符。
我并不热衷于在路由配置中使用CamelJmsDestinationName和一种模拟的主题名称,所以我愿意寻找更好的解决方案。如果camel使用JMSReplyTo自动生成输出主题的输出消息,那就太好了。
目前,问题是camel在JMSReplyTo主题上生成了一个中间输出,但输出是一个未编组的MyRequest对象,这将导致一个异常,显示“ClassNotFoundException:(包名).MyRequest”,这是显而易见的,因为这只是我内部处理中使用的类-我不想将其生成到输出主题。看起来Camel确实在requestProcessor和messageSplitter处理之间隐式使用了JMSReplyTo目的地......为什么?我做错了什么?最佳实践是什么?
2条答案
按热度按时间jhdbpxl91#
在终结点中使用“disableReplyTo=true”。Camel不会尝试使用任何答复选项。
更多详细信息,请参阅:https://camel.apache.org/jms.html
ycggw6v22#
我已经找到了答案...这是荒谬的简单,但我还没有看到它的任何地方的文件。
您只需要调用
.stop()
将路由标记为完成,Camel就会将您在上一步中配置的正文回复到${header.JMSReplyTo}
中配置的目的地,就是这么简单。所以你可以:
你会收到回复的。
我想知道为什么以前没有人发现这个...当我搜索医生或这里时什么都没有...我一定是哑巴,或者医生不完整...