0

根据 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() 时它们不可用一样。

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

谢谢

德里克

4

1 回答 1

0

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

演示此行为的最小示例可以通过 EventNotifierSupportCamelContext.

// 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);

如果您使用处理器创建一个路由,该处理器将属性设置为发送给它的消息......

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 文档一致,即交易完成后(即交易已被修改),交易的副本将被发送给侦听

你的问题出在其他地方。如果您向我提供一个在处理器中设置属性但在回调中丢失的情况的最小示例,我会为您提供帮助。

于 2012-05-21T17:09:51.983 回答