2013-10-17 88 views
1

我已經有了一個消息可以生成多個消息的獨立於原始處理的場景。生成多條消息

我已經試過拆分器EIP,但它看起來像它有一個默認的聚合策略(我似乎無法關閉)。

我能實現這個路線:

from("direct:in").to("bean:multipleMsgGenerator").to("direct:out") 

其中multipleMsgGenerator可以發送獨立消息的n個 「直接:去」?

謝謝!

回答

0

分割器默認返回原始信息(camel_version> = 2.3)。見http://camel.apache.org/splitter.html。這就是說,你可以做任何你想做的事情與分散的塊內的個別拆分消息。

如果郵件的正文是例如一個列表,你可以這樣做:

from ("direct:in) 
    .split(body()) 
    .to("direct:processIndividualMsg") 
    .end() 
    .to("direct:doSomethingWithTheOriginalMsg"); 
+0

我現在明白了,我嘗試了一下,並更好地理解分離器EIP。謝謝! – user2704553

0

對於任何人發現這個問題,我們發現了適合我們的解決方案。
我們收到了一條需要傳遞多條消息的消息。這可以使用: 1.一個自定義處理器,它創建一個List並將其設置到交換體中
2.自定義處理器之後的split()。body()
3. Camel Split邏輯需要該列表並通知它是一個項目列表,因此迭代通過它來獲取消息傳遞
(這在駱駝由org.apache.camel.processor.Splitter完成 - > SplitterIterable, 它調用ObjectHelper.createIterator(值))

一些示例代碼:

路線:

from("direct:myRouteEntrypoint") 
.to("myProducer") 
.split().body() 
.to("log:logProducedMessages"); 

定製生產商:

/** 
* MyProducer 
* 
* Produces a List of String objects and sets that List into the body of 
* the message, to then be later "split" 
*/ 
public class MyProducer implements Processor { 
    public MyProducer() { 
    } 

    public void process(final Exchange inExchange) { 

     List<String> ongoingMessages = new ArrayList<>(); 

     // some loop for each message 
     for (int i = 0; i < 5; i++) { 
      String body = "Output message from MyProducer, this is output message: " + i; 
      body += ", original message body: " + inExchange.getIn().getBody(); 
      ongoingMessages.add(body); 
     } 

     inExchange.getIn().setBody(ongoingMessages); 
    } 
} 

你可以看到每一個「正在進行的消息」可以訪問啓動它的原始郵件。 如果您運行此代碼並向路由發送一條消息,您將看到5個正在創建的消息併發送到「logProducedMessages」記錄器。