(Amplification of  a less specific post
<http://camel.465427.n5.nabble.com/Behavior-of-onCompletion-for-exception-fault-and-stop-td5754257.html>
 
)
a) following exception the onCompletion route runs but stops after the first
processor (seemingly because the property CamelErrorHandlerHandled is in the
copied exchange)
b) onCompletion following exception runs the onCompleteOnly() route not the
onFailureOnly() route 
c) following stop() the onCompletion doesn't run (seemingly because of the
presence of CamelRouteStop property in the copied exchange)
A work around to a) and c) is to remove the relevant properties  - in the
following example in a RoutePolicy
A unit test demonstrating this follows:
    @Test    public void onCompletionStopTest () throws Exception {       
RouteBuilder b = new RouteBuilder() {            @Override            public
void configure() throws Exception {               
onCompletion().onFailureOnly()                        .log("failing
${body}")                        .log("continuing to fail ${body}")             
          
.to("mock:failed");                onCompletion().onCompleteOnly()              
         
.log("completing ${body}")                        .log("continuing to
complete ${body}")                        .to("mock:complete");               
onException(Exception.class)                        .log("Handling
exception")                        .handled(true)                       
.end();                from("direct:input")                       
.routePolicy(new RoutePolicySupport() {                            @Override    
                       
public void onExchangeDone(Route route, Exchange exchange) {                    
           
exchange.removeProperty(Exchange.ERRORHANDLER_HANDLED);                         
      
exchange.removeProperty(Exchange.ROUTE_STOP);                            }      
                 
})                        .choice()                           
.when(simple("${body} == 'stop'"))                               
.log("stopping")                                .stop()                         
  
.when(simple("${body} == 'fault'"))                               
.log("faulting")                               
.setFaultBody(constant("faulted"))                           
.when(simple("${body} == 'except'"))                               
.log("excepting")                                .throwException(new
Exception("Exception requested"))                        .end()                 
      
.log("finishing")                        .to("mock:end");            }       
};        context().addRoutes(b);        MockEndpoint end =
getMockEndpoint("mock:end");        end.expectedMessageCount(1);       
MockEndpoint complete = getMockEndpoint("mock:complete");        // except
should count as failure not completion       
complete.expectedBodiesReceived("finish", "stop", "except");       
MockEndpoint failed = getMockEndpoint("mock:failed");       
failed.expectedBodiesReceived("faulted");       
template().sendBody("direct:input","finish");       
template().sendBody("direct:input","stop");       
template().sendBody("direct:input","fault");       
template().sendBody("direct:input","except");        Thread.sleep(1000);       
assertMockEndpointsSatisfied();    }




--
View this message in context: 
http://camel.465427.n5.nabble.com/Incorrect-behavior-of-onCompletion-for-exception-and-stop-tp5755272.html
Sent from the Camel - Users mailing list archive at Nabble.com.

Reply via email to