(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(); }
<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(); }