【问题标题】:How to ignore one exception in Camel while redelivering如何在重新交付时忽略骆驼中的一个异常
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 谢谢,这行得通,但我已经使用 doTry 和 doCatch 以另一种方式完成了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 2014-09-23
    • 1970-01-01
    • 2020-10-21
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多