共享Camel异常状态

时间:2016-02-04 11:48:47

标签: java error-handling exception-handling apache-camel

我正在开展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逻辑?

我对此的看法:

  • 我想对RouteDefinition#onException(OnExceptionDefinition)方法感到非常满意,我猜,但它不存在......(或者甚至是RouteDefinition#onException(Class ... throwables,OnExceptionDefinition)来指定类)
  • 我尝试在errorHandler上使用ExceptionPolicyStrategy,但显然它不是为此目的构建的(并且即使在“Camel In Action”中也没有找到这一点)
  • 我尝试构建一个RouteBuilder扩展(如Global onException to handle multiple RouteBuilder classes中建议的那样),但我没有一个onException行为可以实现,但我希望能够选择甚至构建一个新的,我觉得允许这样做会很难看。 (编辑:见下文,编辑1& 2)

任何帮助将不胜感激!

谢谢!

修改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),所以这是一次性使用的目的

无论如何,我没有将问题标记为已回答,等待评论和更好/更清洁的主张。

0 个答案:

没有答案