Camel ExchangeCompletedEvent与RoutePolicy.onExchangeDone

时间:2015-09-30 16:34:38

标签: apache-camel

我的骆驼路线配置如下(伪代码)

from(direct:in).to(jdbc:db).split().body().streaming().parallelProcessing()
.process(doSomething).process(createDBquery).out(jdbc:db)

jdbc端点配置为推出JdbcOutputType.StreamList。通过将选择查询发送到direct:in来触发路由。 db中的每一行都在doSomething中处理。它创建一个特殊的结果对象,将其转换为查询以将结果写入db。

我的主要问题是如何检测db的完整结果是否得到处理 - 我想知道它何时完成

我尝试使用EventNotifier并在ExchangeCompletedEvent上过滤。但是对于写入db的每个结果,似乎都会引发此事件。现在我正在考虑使用RoutePolicy /覆盖“onExchangeDone”,但这会改变什么吗?

两者的确切语义是什么?特别是对于在途中创建新交换(例如通过拆分)的路由? 他们是一个干净的方式来检测我的路线何时完成?

1 个答案:

答案 0 :(得分:0)

我有一个answer from Claus itself in camel user group。 在这里使用RoutePolicy更好,因为它只在原始Exchange上调用onExchangeDone。 通过使用该事件,我们必须从split中过滤掉交换。这可以通过检查属性'Exchange.CORRELATION_ID'的存在来完成。

其他可行的解决方案是使用'.onCompletion()'或以这种方式工作的同步:

from("direct:confirm")
.process(new Processor() {
    public void process(Exchange exchange) throws Exception {
        exchange.getUnitOfWork()
              .addSynchronization(new FileRollback());
}
})