JMS主题上的Apache Camel多播然后聚合响应

时间:2018-02-07 18:04:31

标签: java apache-camel jms

我遇到了一个充满挑战的情况,我正在尝试在ActiveMQ代理上执行分散 - 收集EIP模式。对于我的设计,我决定使用RouteBuilder。我想做的路线是这样的:

ActiveMQ:Queue:Test -> Multicast -> ActiveMQ:Topic:Vendors -> Aggregate (Responses received from ActiveMQ:Topic:Vendors) -> ActiveMQ:Queue:Test

基本上我希望能够将请求XML消息发送到ActiveMQ队列"测试"并且请求消息被多播到在主题"供应商"上订阅的所有供应商。然后收集所有响应(可能有N个供应商,这里没有限制,但是完成时间间隔定义为10秒)然后将响应处理为1个XML以便发回。

我的路由代码如下:

from("activemq:Test").setExchangePattern(ExchangePattern.InOut).multicast().inOut("activemq:topic:Vendors").aggregationStrategy(new GroupedMessageAggregationStrategy()).end().to("activemq:test").end()

请求如下所示:

String xml = ...; // Code to create the XML body
Object result = pt.requestBody("activemq:test", xml);
System.out.println("Result: " + result);

玩这个代码,我遇到了一些实例,我会得到我刚发送的requestBody的结果。这与我期望收到的相反。

我查看了所有可用的资源(骆驼文档,示例代码),但我无法解决这个问题。我对骆驼还是比较新的。

编辑:似乎问题源于我的请求的请求 - 响应部分。当我将"更改为"端点到JMS队列列表聚合按预期工作,我得到了适当的响应。但是,在我使用JMS主题的那一刻,我将收到一个"收到未知correlationID的回复#34;警告。深入研究问题我发现这个答案很有用:https://stackoverflow.com/a/26185840

查看我发现的骆驼代码,我发现为什么会遇到这个问题:

if (handler != null) {
    correlation.remove(correlationID);
    handler.onReply(correlationID, message, session);
}

这是org.apache.camel.component.jms.reply.TemporaryQueueReplyManager的第82行。 correlationID将从CorrelationTimeoutMap中删除,因此不会处理具有相同correlationID的下一个响应。由于我处理的是JMS主题,因此我无法生成"独特的"的correlationID。

是否有办法根据" CorrelationID"汇总所有回复?我已经尝试过使用标题(" CorrelationID")

1 个答案:

答案 0 :(得分:0)

您是否看到过与此相关的问题?

Apache Camel: multicast with aggregation - AggregationStrategy called too often

我知道不是同一个问题,但是有一个使用多播与聚合器的测试示例,也许您可​​以开始使用“直接”端点而不是使用ActiveMQ的JMS,然后更改它。

我希望它有所帮助。