可以在apache-camel的错误处理程序之前实现一些切换吗?
类似于:如果它是MyException.class,则使用默认错误处理程序,否则使用死信通道来处理错误。
我尝试使用但似乎无法设置全局,因为它必须在每个路由的方法configure()中。
答案 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"。
答案 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,检查了我需要的内容(重新抛出异常/隐藏异常)。
无论如何,感谢您的建议,它让我以正确的方式。