Inject a splitter that never aggregates

坚强是说给别人听的谎言 提交于 2021-02-10 14:11:40

问题


Camel ver 2.17.3: I want to insert a splitter into a route so that split messages remain split. If I have a "direct" route with a splitter, when control returns from the inner route, I no longer have split messages, only the original.

from("direct:in")
.transform(constant("A,B,C"))
.inOut("direct:inner")
.log("RET-VAL: ${in.body}");

from("direct:inner")
.split()
.tokenize(",")      
.log("AFTER-SPLIT ${in.body}")
;

Based on the answer to a similar question, and Claus's comment below, I tried inserting my own aggregator and always marking the group "COMPLETE". Only the last (split) message is being returned to the outer route.

from("direct:in")
.transform(constant("A,B,C"))
.inOut("direct:inner")
.log("RET-VAL: ${in.body}");

from("direct:inner")
.split(body().tokenize(","), new MyAggregationStrategy())
.log("AFTER-SPLIT ${in.body}")
;


public static class MyAggregationStrategy implements AggregationStrategy
{
  @Override
  public Exchange aggregate(Exchange oldExchange, Exchange newExchange) {
    System.out.println("Agg called with:"+newExchange.getIn().getBody());
    newExchange.setProperty(Exchange.AGGREGATION_COMPLETE_CURRENT_GROUP, true);
    return newExchange;
  }
}

How do I get the messages to stay split, regardless of how routes are nested etc.?


回答1:


See this EIP http://camel.apache.org/composed-message-processor.html

with the splitter only example.

And in the AggregationStrategy you combine together all those splitted sub-messages into one message which is the result you want, eg the outgoing message of the splitter when its done. How you do that depends on your messages and what you want to keep. For example you can put together the sub messages in a List or maybe its XML based and you can append the XML fragments, or something.



来源:https://stackoverflow.com/questions/42786820/inject-a-splitter-that-never-aggregates

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!