我正在尝试为我的camel上下文中的所有路由抛出的所有异常配置异常处理程序.我的方法如下,没有运气:
此时,在spring中定义的路由中抛出的异常由DefaultErrorHandler处理,而不是我试图定义的异常.这是我的错误处理路由定义的样子
public class MyErrorHandlerRouteBuilder extends RouteBuilder {
@Override
public void configure() throws Exception {
onException(Exception.class)
.routeId("errorHandlerRoute")
.handled(true)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
Throwable caused = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Throwable.class);
// do some custom processing of the exception
}
})
.stop();
}
Run Code Online (Sandbox Code Playgroud)
我还能尝试什么,或者我哪里出错了?
小智 7
对于未来的读者,这是我用于camel错误处理的解决方案(这都是java配置,但它将作为spring xml工作):
DeadLetterChannelBuilderBean@Bean
public DeadLetterChannelBuilder myErrorHandler() {
DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder();
deadLetterChannelBuilder.setDeadLetterUri("direct:error");
deadLetterChannelBuilder.setRedeliveryPolicy(new RedeliveryPolicy().disableRedelivery());
deadLetterChannelBuilder.useOriginalMessage();
return deadLetterChannelBuilder;
}
Run Code Online (Sandbox Code Playgroud)
现在这个 bean 将负责拾取错误并将它们定向到direct:errorURI。
您将需要一个路由来侦听 URI,direct:error因为这是您的错误现在被路由的位置。
@Override
public void configure() throws Exception {
from("direct:error")
.to("log:error")
.end();
}
Run Code Online (Sandbox Code Playgroud)
正如您现在所看到的,所有错误都被路由到上述路由,您可以灵活地在全局范围内实现复杂的错误处理逻辑。
您仍然需要将错误处理 bean 注入到每个路由中。我希望骆驼能自动处理这个问题,但我还没有找到办法。尽管使用这种方法,代码重复/开销是最小的。
@Override
public void configure() throws Exception {
errorHandler(myErrorHandler)
from("myStartingUri")
.to("myEndDestination")
.end();
}
Run Code Online (Sandbox Code Playgroud)
查看基于 springs xml 的配置的文档,我认为您需要放入<route errorHandlerRef="myErrorHandler">路由定义。
创建一个抽象基类并在 configure 方法中定义全局错误处理程序。然后在你的路由类中扩展这个基类,并在它们的配置方法中首先调用 super.configure()。
错误处理程序是 Java DSL 中特定的路由构建器。您需要为每个路线构建器创建一个。或者在您的情况下,您需要在 Spring DSL 中定义它(就像您似乎在 Spring 中定义路由一样)。
| 归档时间: |
|
| 查看次数: |
6054 次 |
| 最近记录: |