如何在重新传递时忽略Camel中的一个异常

时间:2016-07-29 14:37:16

标签: java apache-camel cxf

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

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

  • (1)具有带重试策略的onException子句的一条主路由
  • (2)聚合2个路由(并且具有noErrorHandler)的一个子路由,以确保重放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(错误)之前交换标题

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

onException(错误)之后交换标题

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

您是否有任何解决方案可以忽略某些子路由异常而不删除上层路由重试策略?

1 个答案:

答案 0 :(得分:0)

我猜你是通过direct端点连接路线;如果是这种情况,我认为您的主要问题是您将Fault标记为继续,这意味着已处理,这很可能是导致您的重新传递标头被清除的原因。您可以尝试使用seda或消息队列,而不是direct端点,因为它基本上将您的路由链接到一个。