簡體   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