在Apache Camel中同步Exchange副本

时间:2012-05-15 14:11:05

标签: java activemq apache-camel

根据Apache Camel中onCompletion()事件的文档,在那里使用了交换的副本,处理在一个单独的线程中运行。显然在使用EventNotifierSupport时也是如此,因为我在处理器中设置了一些交换属性,然后我有一个类似的方法

public void notify(EventObject event) throws Exception {

    if (event instanceof ExchangeCompletedEvent) {
    //..get exchange properties and print them using event.getExchange()
    }
}

我在处理器中设置的属性似乎在这个“已完成的事件”中不可用,就像我在DSL中使用onComplete()时一样。

如何将交换的明显副本合并在一起,以便我可以可靠地获取在路径的其他处理器中设置/修改的属性?

由于

德里克

1 个答案:

答案 0 :(得分:0)

实际上,参与交换的处理器中添加的属性在这两个回调中都可用,即onCompletion()EventNotifierSupport#notify()

通过在EventNotifierSupport上注册以下CamelContext回调,可以重现演示此行为的最小示例。

// Create listener
EventNotifierSupport eventNotifierSupport = new EventNotifierSupport(){

  @Override
  public void notify(EventObject event) throws Exception {
    if (event instanceof ExchangeCompletedEvent) {
      assert ((ExchangeCompletedEvent) event).getExchange().getProperties().containsKey("ADDED");
    }
  }

...

}

// Register listener in CamelContext
CamelContext camelContext = new DefaultCamelContext();
camelContext.getManagementStrategy().addEventNotifier(eventNotifierSupport);

如果您使用processor创建路由,该路由会将属性设置为发送给它的消息...

camelContext.addRoutes(new RouteBuilder() {

  @Override
  public void configure() throws Exception {
    from("direct:start").process(new Processor() {
      @Override
      public void process(Exchange exchange) throws Exception {
        exchange.getProperties().put("ADDED","ADDED");
      }
    });
  }

});
camelContext.start();
camelContext.createProducerTemplate().sendBody("direct:start", "addPropertyToMe");

...你会看到监听器中的断言总是通过。这与Camel文档一致,该文档表示交易的副本将在交易完成后发送给监听者(即交易所已被修改)。

你的问题在别处。如果你给我一个最小的例子,我会帮助你,在处理器中设置属性但在回调中缺少属性。