繁体   English   中英

然后在JMS主题上进行Apache Camel组播,然后汇总响应

[英]Apache Camel Multicast on JMS Topic then Aggregate responses

我遇到了一个充满挑战的情况,我试图在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的结果。 这与我期望得到的相反。

我已经查看了所有可用资源(骆驼文档,示例代码),但无法弄清楚这个问题。 我还不太熟悉骆驼。

编辑:似乎问题出在我的请求的请求-响应部分。 当我将“ to”端点更改为JMS队列列表时,聚合将按预期方式工作,并且我会得到正确的响应。 但是,当我使用JMS主题时,将收到“收到未知相关ID的答复”警告。 深入研究问题,我发现此答案很有用: https : //stackoverflow.com/a/26185840

通过查看我发现的骆驼代码,我发现了为什么遇到该特定问题的原因:

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

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

是否有一种方法可以基于“ CorrelationID”汇总所有响应? 我已经尝试使用header(“ CorrelationID”)

你看到这个问题相关吗?

Apache Camel:带有聚合的多播-AggregationStrategy经常调用

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

希望对您有所帮助。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM