Apache-camel - 自定义错误处理

时间:2016-09-06 14:12:06

标签: java apache-camel

可以在apache-camel的错误处理程序之前实现一些切换吗?

类似于:如果它是MyException.class,则使用默认错误处理程序,否则使用死信通道来处理错误。

我尝试使用但似乎无法设置全局,因为它必须在每个路由的方法configure()中。

4 个答案:

答案 0 :(得分:1)

是的,你可以有一个通用的错误处理程序。

在configure方法中,我这样做了:

public void configure() throws Exception {
  ExceptionBuilder.setup(this);
  ...
}

ExceptionBuilder类如下所示:

public class ExceptionBuilder {

    public static void setup(RouteBuilder routeBuilder) {
      routeBuilder.onException(Exception.class).useOriginalMessage().handled(true).to("direct:errorHandler");
    }  
}

最后在错误处理程序中根据您的要求进行配置。这意味着,将正文和标题保存到日志文件或将它们发送到jms队列或停止处理或其他任何内容。那取决于你。您只需配置一次并从所有routeBuilder类中引用它。

答案 1 :(得分:1)

errorHandler的全局范围仅为每个RouteBuilder实例的 。您需要在configure()方法中创建一个包含错误处理逻辑的基本RouteBuilder类,然后从中扩展所有其他路由(不要忘记调用super.configure())。

您可以使用errorHandler的组合作为异常的catch-all,并使用onException()处理特定异常

errorHandler(deadLetterChannel("mock:generalException"));

onException(NullPointerException.class)
    .handled(true)
    .to("mock:specificException");

具有这些处理程序的任何路由都将发送将NullPointerException抛出到端点的交换" mock:specificException"。抛出的任何其他异常都将由errorHandler处理,并且交换将被发送到" mock:generalException"。

http://camel.apache.org/error-handler.html

http://camel.apache.org/exception-clause.html

答案 2 :(得分:1)

Use try-catch in camel route

.doTry()
 .to("bean:<beanName>?method=<method>")
.endDoTry()

.doCatch(MyException.class)
 .to("bean:<beanName>?method=<method1>")
.doCatch(Exception.class)
 .to("bean:<beanName>?method=<method2>")

答案 3 :(得分:0)

<强>解决方案: 我使用DeadLetterChannelBuilder作为错误处理程序,failProcessor和deadLetterHandleNewException为false,检查了我需要的内容(重新抛出异常/隐藏异常)。

无论如何,感谢您的建议,它让我以正确的方式。