【发布时间】:2016-12-04 07:55:50
【问题描述】:
我必须实现一个错误处理程序,该处理程序在发送 SOAP 请求并处理其响应的业务流程上使用 Camel 重新交付策略。在处理部分,可能会抛出一个特殊的异常(RetryException)。在错误处理程序级别捕获此异常(感谢 onException(RetryException.class))。 这是最简单的部分。
现在我想忽略可能由 cxf 端点抛出的异常(在每个示例出现连接错误的情况下)并处理它们。 所以我尝试:
- (1) 一个主路由,带有重试策略的 onException 子句
- (2) 一个子路由聚合 2 个路由(并且没有错误处理程序),以确保重播 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 认为这个异常是第一个。所以路由进入了一种永远重试的循环。
交换标头之前 onException(Fault):
Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, CamelRedelivered=true, CamelRedeliveryCounter=1, CamelRedeliveryMaxCounter=2, operationName=[...]}
交换标头之后 onException(Fault):
Headers: {breadcrumbId=ID-ITEM-S28636-63117-1469800853403-0-1, operationName=[...]}
你有什么解决方案可以忽略一些子路由异常而不清除上层路由重试策略吗?
【问题讨论】:
标签: java apache-camel cxf