2012-05-15 27 views
0

根据Apache Camel中onCompletion()事件的文档,交换的副本在那里使用,并且处理在单独的线程中运行。显然,这也是使用EventNotifierSupport的时候,因为我是在一个处理器设置一些交换性能真的,然后我有类似在Apache Camel中同步交换副本

public void notify(EventObject event) throws Exception { 

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

看来,我在处理器中设置的属性是不可用此方法“完成的事件”与我在DSL中使用onComplete()时不可用的完全相同。

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

由于

德里克

回答

0

实际上在参与该交换处理器加入的属性在onCompletion()EventNotifierSupport#notify()在两个这些回调即可用。

演示此行为的最小示例可以通过在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"); 

...你会看到侦听器断言总是通过。这符合骆驼文件,其中说交易副本将在交易完成后(即交易所已被修改)发送给听众

你的问题在别处。我会帮助你,如果你给我提供一个最简单的例子,就是在处理器中设置属性但是在回调中丢失的情况。

+0

对不起,我没有早点回复你 - 只是注意到我有一个答案。你能告诉我你使用的是什么版本的骆驼?我似乎无法得到你所看到的同样的行为。谢谢 – Derek

+0

嗨德里克。我正在使用骆驼2.9.2。 –