我正在开展Camel项目,我们正在消费多个外部合作伙伴/服务。我正在努力解决错误和异常问题。
目前我有一个工作版本,但我真的不满意...只是为了处理错误而重复的代码。路线看起来像这样:
from("direct:myEntryPoint")
.errorHandler(defaultErrorHandler())
.onException(IOException.class)
.asyncDelayedRedelivery()
.useOriginalMessage()
.delayPattern("0:100;5:500;10:2000;20:60000")
.maximumRedeliveries(-1)
.end()
.onException(Throwable.class)
.handled(true)
.to("mock:logAndStoreFailedMessage")
.end()
.to("mock:businessLogic");
这里,行为很简单:如果有IOException,我们认为我们没有到达合作伙伴,稍后会再次重试。其他异常处理如严重错误,我们只会记录消息失败。
其他一些合作伙伴被认为更为关键,我们甚至不想重试IOException:
from("direct:myEntryPoint")
.errorHandler(defaultErrorHandler())
.onException(Throwable.class)
.handled(true)
.to("mock:logAndStoreFailedMessage")
.end()
.to("mock:businessLogic");
我们也有其他行为,但我不想破坏帖子并将它们全部列出......
我的问题是: 我们如何跨多个路由共享onException逻辑?
我对此的看法:
任何帮助将不胜感激!
谢谢!
修改1:
我尝试了更多的子类化RouteBuilder,并找到了我可以忍受的东西,但我相信有更好的方法可以实现!以下是子类的代码示例:
public abstract class MyRouteBuilder extends RouteBuilder {
protected ErrorHandlerBuilder firstErrorHandler() {
final DefaultErrorHandlerBuilder errorHandlerBuilder = super.defaultErrorHandler();
onException(IOException.class)
.asyncDelayedRedelivery()
.useOriginalMessage()
.delayPattern("0:100;5:500;10:2000;20:60000")
.maximumRedeliveries(-1);
onException(Throwable.class)
.handled(true)
.to("mock:logAndStoreFailedMessage")
.end();
return errorHandlerBuilder;
}
}
编辑2:
当然,当你在同一个RouteBuilder中声明许多from
路由时,它不起作用(因为,在声明路由后你不能写一般onException
),所以这是一次性使用的目的
无论如何,我没有将问题标记为已回答,等待评论和更好/更清洁的主张。