生成多条消息

时间:2013-10-17 16:50:44

标签: apache-camel

我有一个场景,其中一条消息可以生成多条消息,可以独立于原始消息进行处理。

我尝试过拆分器EIP,但看起来它有一个默认的聚合策略(我似乎无法关闭)。

我可以实现这条路线:

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

其中multipleMsgGenerator可以发送n个独立消息到“direct:out”?

谢谢!

2 个答案:

答案 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”记录器。