如何在重新交付时忽略 Camel 中的一个异常

How to ignore one exception in Camel while redelivering

我必须实现一个错误处理程序,该处理程序在发送 SOAP 请求并处理其响应的业务流程中使用 Camel Redelivery Policy。在流程部分,可能会抛出一个特殊的异常(RetryException)。在错误处理程序级别捕获此异常(感谢 onException(RetryException.class))。 那是容易的部分。

现在我想忽略 cxf 端点可能抛出的异常(在每个示例连接错误的情况下)并处理它们。 所以我尝试:

为了忽略 cxf 端点抛出的异常,我实现了这样的路由 (3):

public void configure() {
    from(ROUTE_NAME).
    .handleFault() // To handle Soap fault
    .onException(Fault.class)
        .continued(true)
        .end()
    .to("cxf:[...]")
    ;
}

它就像一个魅力,响应处理器在抛出 RetryException 之前执行一些检查......但是继续的指令丢弃了我之前拥有的所有关于重新传递的信息,Camel 认为这个异常是第一个。因此路由进入了一种永远重试的循环。

交换 headers 之前 onException(故障):

Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, CamelRedelivered=true, CamelRedeliveryCounter=1, CamelRedeliveryMaxCounter=2, operationName=[...]}

交换 headers after onException(Fault) :

Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, operationName=[...]}

你有什么解决方案可以忽略某些 sub-route 异常而不删除上层路由重试策略吗?

我猜你是通过 direct 端点连接路由;如果是这样,我认为您的主要问题是您将 Fault 标记为继续,这意味着已处理,这很可能是导致您的重新交付 headers 被清除的原因。您可以尝试使用 seda 或消息 queue,而不是 direct 端点,因为它基本上 link 您的路线合二为一。