是否是设计和期望的行为,使Camel路由在具有多个SEDA队列的管道中不执行onCompletion任务?

tcomlyy6  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(163)

我偶然发现了一个问题,在通过SEDA队列传递消息的路由之间,onCompletion不工作。
路由配置与此简化版本类似:

from("direct:a")
  .onCompletion().log("a - done").end()
  .to("seda:b");

from("seda:b")
  .onCompletion().log("b - done").end()
  .to("seda:c");

from("seda:c")
  .onCompletion().log("c - done").end()
  .to("seda:d");

from("seda:d")
  .onCompletion().log("d - done").end()
  .to("mock:end");

使用此配置,我只能获得"d - done"日志记录。
我调试了执行过程,注意到“a”、“b”和“c”中的onCompletion处理程序没有得到执行,因为它们是路由作用域的,并试图在下一个路由的作用域中执行。
这是因为它们从初始交换机切换到为下一个路由准备的交换机,它发生在SedaProducer::addToQueue方法中,copy参数定义为true,这使得::prepareCopy方法被调用,而::prepareCopy方法又调用ExchangeHelper.createCorrelatedCopyhandover定义为true
在我看来,这就像是一个错误,因为通过查看路由配置,我可以预料到不同的行为:所有的onCompletion任务都会被执行,并报告路由的最终完成。虽然可能我在这里遗漏了一些东西,如果是这样的话,我会很感激你们帮助我找出遗漏的细节。

c90pui9n

c90pui9n1#

我实现的变通方案很难看,但确实有用。在发送到下一个路由(队列)之前,我们将完成交给一个保持器交换,发送后,我们将它们从持有者处交回。
下面是一个代码示例:

route
        .process(exchange -> {
            var holder = new DefaultExchange(exchange.getContext());
            exchange.adapt(ExtendedExchange.class).handoverCompletions(holder);
            exchange.setProperty(SYNC_HOLDER_PROPERTY, holder);
        })
        .to("seda://next")
        .process(exchange -> exchange
            .getProperty(SYNC_HOLDER_PROPERTY, ExtendedExchange.class)
            .handoverCompletions(exchange));

相关问题