在RouteBuilder的路由中一起使用onException和onCompletion

时间:2014-12-16 11:39:26

标签: apache-camel onexception

我想使用OnException& OnComplition在一个路线上(Camel版本2.10.0.redhat-60024):

from("direct:camelTestEndpoint").
            onCompletion().
                log("onCompletion1").
                log("onCompletion2").
                log("onCompletion3").
            end().
            onException(Throwable.class).
                handled(true).
                log("onException").
            end().

            log("route")
            .throwException(new RuntimeException());

虽然它不像我期望的那样有效。 主路由中的异常导致onComplition路由在第一个处理器之后停止(它在PipelineHelper的continueProcessing()方法中处理)。 Camel检查是否处理了异常,如果是,则停止处理。

输出:

route
onException
onCompletion1

我是否有温和的方式说骆驼它应该跳过这个(没有" CamelErrorHandlerHandled"属性删除)?

由于

2 个答案:

答案 0 :(得分:1)

这是Camel版本中的一个错误。

这已由CAMEL-7707修复。

作为一种解决方法,您需要在onCompletion的第一个过程中手动从交换中删除这些详细信息。

例如

之类的东西
    // must remember some properties which we cannot use during onCompletion processing
    // as otherwise we may cause issues
    Object stop = exchange.removeProperty(Exchange.ROUTE_STOP);
    Object failureHandled = exchange.removeProperty(Exchange.FAILURE_HANDLED);
    Object caught = exchange.removeProperty(Exchange.EXCEPTION_CAUGHT);
    Object errorhandlerHandled = exchange.removeProperty(Exchange.ERRORHANDLER_HANDLED);

答案 1 :(得分:0)

//STEP1: call Successful Route
   from("direct:Route_OnCompletion_OnSuccess")
        .onCompletion()
          .onCompleteOnly()
            .log("On Complete Passed")
            .to("direct:Route_OnSuccess")
        .end()
        .to("direct:Route_OnCompletion_OnFailure");

//STEP2: call Failure Route                
    from("direct:Route_OnCompletion_OnFailure")
        .onCompletion()           
            .onFailureOnly()    
                .log("On Complete Failed "+ body())
                .to("direct:Route_OnFailure")       
        .end() 
        .to("direct:Route_MainFlow");