onException и onCompletion вместе в маршруте RouteBuilder

Я хотел бы использовать 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 после первого процессора (это обрабатывается в методе continueProcessing() PipelineHelper). Верблюд проверяет, было ли обработано исключение, и если да, останавливает обработку.

Выход:

route
onException
onCompletion1

Есть ли я мягкий способ сказать верблюду, что он должен пропустить это (без удаления свойства "CamelErrorHandlerHandled")?

Спасибо

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);
//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");
Другие вопросы по тегам