Stig Rohde Døssing created CAMEL-13706:
------------------------------------------

             Summary: Allow conditional exception propagation to parent 
RouteBuilders from DefaultErrorHandler
                 Key: CAMEL-13706
                 URL: https://issues.apache.org/jira/browse/CAMEL-13706
             Project: Camel
          Issue Type: New Feature
            Reporter: Stig Rohde Døssing


Exception propagation between RouteBuilders is currently only possible with the 
NoErrorHandler. It would be great if the DefaultErrorHandler could be 
configured to propagate exceptions it is not configured to handle. This would 
allow more Java-like exception handling for pipelines that cross RouteBuilders.

Basically the behavior I'd like from the DefaultErrorHandler is that exceptions 
thrown from a route that are not handled, and exceptions thrown from 
onException clauses, are handled the same way they would if the NoErrorHandler 
were configured. This would cause them to propagate to handlers in the parent.

An example of how this could look:

{code}
class RestRouteBuilder extends RouteBuilder {
  onException(Exception.class)
    .handled(true)
    .process(return a 500-series code)

  onException(JsonProcessingException.class)
    .handled(true)
    .process(return a 400-series code)

   from(rest)
     .choice()
       .when(the request is type A)
         .to(type A route)
       .otherwise()
         .to(type B route)
}

class TypeARouteBuilder extends RouteBuilder {
   setErrorHandlerBuilder(defaultErrorHandler().propagateUnknownExceptions());

  onException(SomeRouteSpecificException.class)
     .handled(true)
     //Any exception thrown here is propagated to the RestRouteBuilder's 
onException clauses

  from(type A route)
     //SomeRouteSpecificException gets handled by the onException clause above
     //Anything else is propagated to the RestRouteBuilder's onException clauses
    .to(write to DB route)
}

class TypeBRouteBuilder extends RouteBuilder {

  setErrorHandlerBuilder(defaultErrorHandler().propagateUnknownExceptions());
  
  onException(SomeOtherRouteSpecificException.class)
     .handled(true)
      //Any exception thrown here is propagated to the RestRouteBuilder's 
onException clauses

  from(type B route)
     //SomeOtherRouteSpecificException gets handled by the onException clause 
above
     //Anything else is propagated to the RestRouteBuilder's onException clauses
    .to(write to DB route)
}

class DBRouteBuilder extends RouteBuilder {
  setErrorHandlerBuilder(defaultErrorHandler().propagateUnknownExceptions());

  onException(AuthenticationException.class)
     .redeliveryPolicy(new RedeliveryPolicy().maximumRedeliveries(10))

  from(type A route)
     //AuthenticationException gets handled by the onException clause above
     //Anything else is propagated to either TypeA or TypeB onException 
clauses, and possibly on to RestRouteBuilder's clauses
    .to(the DB endpoint)
}
{code}

I'd be happy to work on implementing this option, assuming there isn't 
opposition to creating a feature like this.



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to