具有并行处理的 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())