具有并行处理的 Apache camel muticast 不会将异常传播到死信处理程序
Apache camel muticast with parallel processing does not propagate exceptions to dead letter handler
我有骆驼路线。
from(errorMultiDirect).routeId("errorMulticastTest")
.errorHandler(deadLetterChannel(mock)
.onPrepareFailure(errorProcessor).maximumRedeliveries(0))
.log(LoggingLevel.INFO, "Testing Error route")
.setHeader(OrderMessageConstants.WIMS_MSG_TYPE, simple("body[messageType]"))
.setHeader(OrderMessageConstants.SAP_MESSAGE_ID, simple("body[messageID]"))
.setHeader(OrderMessageConstants.ORDER_NUMBER, simple("body[orderHeader][order]"))
.multicast().parallelProcessing().shareUnitOfWork().stopOnException().to("direct:materialsTest", "direct:qmDocTest", "direct:sdsTest").end()
.to("log:com.sial.NotifyStatusLogger?level=INFO");
如果在任何多播路由中发生异常,如 materaialsTest,异常会在多播代码中捕获,但永远不会发送到死信通道。根据文档,设置 shareUnitOfWork 应该会发生这种情况,但它不会,设置 stopOnException 也不会。
我错过了什么吗?
我有第二个不使用多播的测试路由,它按预期工作。
from(errorDirect).routeId("errorMaterialTest")
.errorHandler(deadLetterChannel(mock)
.onPrepareFailure(errorProcessor).maximumRedeliveries(0))
.log(LoggingLevel.INFO, "Testing Error route")
.setHeader(OrderMessageConstants.WIMS_MSG_TYPE, simple("body[messageType]"))
.setHeader(OrderMessageConstants.SAP_MESSAGE_ID, simple("body[messageID]"))
.setHeader(OrderMessageConstants.ORDER_NUMBER, simple("body[orderHeader][order]"))
.bean(materialsEnrichment)
.to("log:com.sial.NotifyStatusLogger?level=INFO");
当 materialsEnrichment bean 抛出异常时,第二个路由确实将消息发送到死信通道。这是通过 "direct:materialsTest".
的多播路由调用的同一个 bean
您需要关闭直接路由中的错误处理,因为死信通道仅在您的路由中配置为路由范围的错误处理程序。那么直接路由的故障应该由您的多播路由处理。
from("direct:xxx")
.errorHandler(noErrorHandler())
我有骆驼路线。
from(errorMultiDirect).routeId("errorMulticastTest")
.errorHandler(deadLetterChannel(mock)
.onPrepareFailure(errorProcessor).maximumRedeliveries(0))
.log(LoggingLevel.INFO, "Testing Error route")
.setHeader(OrderMessageConstants.WIMS_MSG_TYPE, simple("body[messageType]"))
.setHeader(OrderMessageConstants.SAP_MESSAGE_ID, simple("body[messageID]"))
.setHeader(OrderMessageConstants.ORDER_NUMBER, simple("body[orderHeader][order]"))
.multicast().parallelProcessing().shareUnitOfWork().stopOnException().to("direct:materialsTest", "direct:qmDocTest", "direct:sdsTest").end()
.to("log:com.sial.NotifyStatusLogger?level=INFO");
如果在任何多播路由中发生异常,如 materaialsTest,异常会在多播代码中捕获,但永远不会发送到死信通道。根据文档,设置 shareUnitOfWork 应该会发生这种情况,但它不会,设置 stopOnException 也不会。 我错过了什么吗?
我有第二个不使用多播的测试路由,它按预期工作。
from(errorDirect).routeId("errorMaterialTest")
.errorHandler(deadLetterChannel(mock)
.onPrepareFailure(errorProcessor).maximumRedeliveries(0))
.log(LoggingLevel.INFO, "Testing Error route")
.setHeader(OrderMessageConstants.WIMS_MSG_TYPE, simple("body[messageType]"))
.setHeader(OrderMessageConstants.SAP_MESSAGE_ID, simple("body[messageID]"))
.setHeader(OrderMessageConstants.ORDER_NUMBER, simple("body[orderHeader][order]"))
.bean(materialsEnrichment)
.to("log:com.sial.NotifyStatusLogger?level=INFO");
当 materialsEnrichment bean 抛出异常时,第二个路由确实将消息发送到死信通道。这是通过 "direct:materialsTest".
的多播路由调用的同一个 bean您需要关闭直接路由中的错误处理,因为死信通道仅在您的路由中配置为路由范围的错误处理程序。那么直接路由的故障应该由您的多播路由处理。
from("direct:xxx")
.errorHandler(noErrorHandler())