我正在尝试为我的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();
}
我还能尝试什么,或者我哪里出错?
答案 0 :(得分:3)
创建一个抽象基类,并在configure方法中定义全局错误处理程序。然后在你的路由类中扩展这个基类,并在它们的configure方法中首先调用super.configure()。
答案 1 :(得分:2)
对于未来的读者,这是我用于骆驼错误处理的解决方案(这是所有java配置,但它将作为spring xml工作):
DeadLetterChannelBuilder
Bean @Bean
public DeadLetterChannelBuilder myErrorHandler() {
DeadLetterChannelBuilder deadLetterChannelBuilder = new DeadLetterChannelBuilder();
deadLetterChannelBuilder.setDeadLetterUri("direct:error");
deadLetterChannelBuilder.setRedeliveryPolicy(new RedeliveryPolicy().disableRedelivery());
deadLetterChannelBuilder.useOriginalMessage();
return deadLetterChannelBuilder;
}
现在这个bean将负责获取错误并将它们指向direct:error
URI。
您需要一个路由来侦听URI direct:error
,因为这是您的错误现在被路由的地方。
@Override
public void configure() throws Exception {
from("direct:error")
.to("log:error")
.end();
}
正如您现在所看到的,所有错误都被路由到上述路由,您可以灵活地全局实现复杂的错误处理逻辑。
您仍需要将错误处理bean注入每个路由。我希望骆驼会自动处理这个,但我还没找到办法。虽然使用这种方法,代码重复/开销很小。
@Override
public void configure() throws Exception {
errorHandler(myErrorHandler)
from("myStartingUri")
.to("myEndDestination")
.end();
}
查看基于spring xml的配置文档,我认为您需要在路由定义中添加<route errorHandlerRef="myErrorHandler">
。
答案 2 :(得分:1)
错误处理程序是Java DSL中特定于路径构建器的。您需要为每个路由构建器创建一个。或者在您的情况下,您需要在Spring DSL中定义它(因为您似乎在Spring中定义了路由)。
答案 3 :(得分:0)
从应用程序上下文中检索作为资源的 XML 路由并将它们加载到骆驼上下文后,您将拥有一个 RoutesDefinition 对象,您可以尝试像这样操作
Resource xmlRoutes = applicationContext.getResource("path/to/xml/routes");
RoutesDefinition routeDefinitions = camelContext.loadRoutesDefinition(xmlRoute.getInputStream());
for (RouteDefinition routeDefinition : routeDefinitions.getRoutes()) {
routeDefinition
.onException(Exception.class)
.handled(true)
// do some custom processing of the exception