我偶然发现了一个问题,在通过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.createCorrelatedCopy
,handover
定义为true
。
在我看来,这就像是一个错误,因为通过查看路由配置,我可以预料到不同的行为:所有的onCompletion
任务都会被执行,并报告路由的最终完成。虽然可能我在这里遗漏了一些东西,如果是这样的话,我会很感激你们帮助我找出遗漏的细节。
1条答案
按热度按时间c90pui9n1#
我实现的变通方案很难看,但确实有用。在发送到下一个路由(队列)之前,我们将完成交给一个保持器交换,发送后,我们将它们从持有者处交回。
下面是一个代码示例: