我有一个场景,其中一条消息可以生成多条消息,可以独立于原始消息进行处理。
我尝试过拆分器EIP,但看起来它有一个默认的聚合策略(我似乎无法关闭)。
我可以实现这条路线:
from("direct:in").to("bean:multipleMsgGenerator").to("direct:out")
其中multipleMsgGenerator可以发送n个独立消息到“direct:out”?
谢谢!
答案 0 :(得分:0)
默认情况下,拆分器返回原始消息(camel_version> = 2.3)。见http://camel.apache.org/splitter.html。也就是说,您可以对溢出块内的各个拆分消息执行任何操作。
如果邮件的正文是List,例如你可以这样做:
from ("direct:in)
.split(body())
.to("direct:processIndividualMsg")
.end()
.to("direct:doSomethingWithTheOriginalMsg");
答案 1 :(得分:0)
对于发现此问题的任何人,我们找到了适合我们的解决方案
我们收到了一条消息,需要传递多条消息。这可以使用:
1.一个自定义处理器,它创建一个List并将其设置到交换机体中
2.自定义处理器之后的split()。body()
3. Camel Split逻辑获取List并注意它是一个项目列表,因此迭代它以使消息向前传递
(这是由Camel by org.apache.camel.processor.Splitter完成的 - > SplitterIterable,
它调用ObjectHelper.createIterator(value))
一些示例代码:
路线:
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”记录器。