根据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()时一样。
如何将交换的明显副本合并在一起,以便我可以可靠地获取在路径的其他处理器中设置/修改的属性?
由于
德里克
答案 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文档一致,该文档表示交易的副本将在交易完成后发送给监听者(即交易所已被修改)。
你的问题在别处。如果你给我一个最小的例子,我会帮助你,在处理器中设置属性但在回调中缺少属性。