Hi,

I would like to use different RouteBuilders to declare my routes. I have a 
RouteBuilder that sets up some REST endpoints, and forwards requests to routes 
declared in other RouteBuilders. The REST RouteBuilder sets up some general 
exception handling to return "nice" HTTP status codes in case of errors.

I have some routes set up as follows:

RestRouteBuilder {
  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)
}

TypeARouteBuilder {
  onException(SomeRouteSpecificException.class)
     .handled(true)
     .process(handle it in some way)

  from(type A route)
    .process(do something that can throw both route specific and other 
exception types)
    .to(write to DB route)
}

TypeBRouteBuilder {
  onException(SomeOtherRouteSpecificException.class)
     .handled(true)
     .process(handle it in some way)

  from(type B route)
    .process(do something that can throw both route specific and other 
exception types)
    .to(write to DB route)
}

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

  from(type A route)
    .to(the DB endpoint)
}

I'd like to be able to set onException clauses in each RouteBuilder, and have 
uncaught exception types propagate up to the REST route builder's onException 
clauses.

Others have asked about this before, and have gotten the following suggestions:

  *   Put the exception handling in a common superclass. - This works, but 
requires me to make a hierarchy of superclasses, and to remember to call 
super.configure in each RouteBuilder. It also prevents me from varying 
exception handling for exceptions thrown from DBRouteBuilder depending on 
whether it was called by TypeARouteBuilder or TypeBRouteBuilder.
  *   Set the error handler to the NoErrorHandler in the TypeA/B and DB route 
builders, and propagate all exceptions to the REST route builder - This 
prevents me from setting onException clauses in each RouteBuilder. Best I can 
do in this case is to use doTry/doCatch in each route in the TypeA/B and DB 
route builders. This is unpleasant if I have many routes.

The reason I can't get more Java-like exception propagation seems to be that 
when the DefaultErrorHandler gets an exception it is not configured to handle, 
it delegates handling to the FatalFallbackErrorHandler. This prevents 
propagation to a parent RouteBuilder.

Would it be possible to implement a configuration option for the 
DefaultErrorHandler, that would make it act like the NoErrorHandler if it 
encounters an exception it isn't configured to handle (i.e. there is no 
exception policy configured for that type)? Is there a good reason not to have 
such an option?


Reply via email to