如何在重新交付时忽略 Camel 中的一个异常
How to ignore one exception in Camel while redelivering
我必须实现一个错误处理程序,该处理程序在发送 SOAP 请求并处理其响应的业务流程中使用 Camel Redelivery Policy。在流程部分,可能会抛出一个特殊的异常(RetryException)。在错误处理程序级别捕获此异常(感谢 onException(RetryException.class))。
那是容易的部分。
现在我想忽略 cxf 端点可能抛出的异常(在每个示例连接错误的情况下)并处理它们。
所以我尝试:
- (1) 一条带有重试策略的onException子句的主路由
- (2) 一个子路由聚合了 2 个路由(并且没有 ErrorHandler)以确保重放 2 个路由,而不仅仅是处理抛出异常的路由:
- (3)发送SOAP请求的路由
- (4) 处理响应并抛出retryException的路由。
为了忽略 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 您的路线合二为一。
我必须实现一个错误处理程序,该处理程序在发送 SOAP 请求并处理其响应的业务流程中使用 Camel Redelivery Policy。在流程部分,可能会抛出一个特殊的异常(RetryException)。在错误处理程序级别捕获此异常(感谢 onException(RetryException.class))。 那是容易的部分。
现在我想忽略 cxf 端点可能抛出的异常(在每个示例连接错误的情况下)并处理它们。 所以我尝试:
- (1) 一条带有重试策略的onException子句的主路由
- (2) 一个子路由聚合了 2 个路由(并且没有 ErrorHandler)以确保重放 2 个路由,而不仅仅是处理抛出异常的路由:
- (3)发送SOAP请求的路由
- (4) 处理响应并抛出retryException的路由。
为了忽略 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 您的路线合二为一。