关联两个Camel路由上的消息

时间:2014-09-19 09:09:16

标签: apache-camel

在我的应用程序中,我有一个通用的Camel Route,如下面的

from("direct:something").to("direct:outgoing")

然后在我的代码中动态地部署另一条路径:

from("direct:outgoing").process(processor)

从路径1流向路径2时,将创建一个新的Exchange。是否有惯用的方法来关联它们?我应该在发送之前在第一条路线上设置EXCHANGE.Correlation_ID标头吗?

2 个答案:

答案 0 :(得分:2)

这绝对应该在一个交易所处理。运行此测试,您将看到相同的camel Exchange,具有相同的属性等。

public class CamelExchangeTest {
    public static void main(String[] args) throws Exception {
        final Processor showExchangeIdProcessor = new Processor() {
            @Override
            public void process(Exchange exchange) throws Exception {
                System.out.println(exchange.getExchangeId());
            }
        };

        Main camelMain = new Main();
        camelMain.addRouteBuilder(new RouteBuilder() {
            @Override
            public void configure() throws Exception {
                from("timer:foo?period=1s&repeatCount=1")
                        .log("excgabge created!")
                        .process(showExchangeIdProcessor)
                        .to("direct:outgoing")
                ;

                from("direct:outgoing")
                        .log("outgoing!")
                        .process(showExchangeIdProcessor)
                ;
            }
        });
        camelMain.run();
    }
}

输出:

ID-MYPC-55760-1411129552791-0-2
ID-MYPC-55760-1411129552791-0-2

所以其他事情正在发生。当你说"direct:outgoing"时,你的意思是那个或者它是不同的东西 - 也许是一个不同的组成部分?

当你说路线是动态创建的时候,究竟是怎么做的,以及什么时候(以及为什么?)

答案 1 :(得分:1)

来自Camel doc

  

某些EIP模式会剥离子邮件,在这种情况下,Camel会在Exchange上添加一个关联ID作为属性,并使用键Exchange.CORRELATION_ID链接回源Exchange。例如,Splitter,Multicast,Recipient List和Wire Tap EIP就是这样做的。

因此,Exchange.CORRELATION_ID由Camel设置,不应由您的应用程序设置。但如果您需要,请随意设置自定义标题或属性:

exchange.getIn().setProperty("myProperty", myIdentifier);