Home > other >  Exception handling in parent router
Exception handling in parent router

Time:04-04

I have parent router that calls other routers. The parent router has all the exception handling logic. In all child routers, on exception, I want to just add properties in the exchange object and leave the actual exception handling in the parent(main) router.

Example:

public class ParentRouter extends RouteBuilder {
    @Override 
    public void configure() throws Exception {
        onException(CustomException.class)
            .process(new ExceptionProcessor())
            .handled(true);
         from("direct:parent-route").to("direct:child-route");

         from("direct:child-route")
             .onException(CustomException.class)
                 .process(new Processor(){
                     @Override 
                     public process(Exchange exchange){
                        exchange.setProperty("childExceptionFlg", "true");
                     }
                 });
           
}

As per my requirement, when CustomExpection is thrown in the child router, it should add a property to the exchange object and the final handling code needs to be executed in the ExceptionProcessor in the parent router.

CodePudding user response:

What you try to achieve can be done using routes dedicated to error handling that call each other (child error handler route calls parent error handler route) or at least a route for the main error handler that is called by the exception policy of your child routes.

Something like:

// The main logic of the main exception policy is moved to a dedicated
// route called direct:main-error-handler
onException(CustomException.class)
    .to("direct:main-error-handler")
    .handled(true);
from("direct:parent-route").to("direct:child-route");
from("direct:child-route")
    .onException(CustomException.class)
        // Set the exchange property childExceptionFlg to true
        .setProperty("childExceptionFlg", constant("true"))
        // Call explicitly the main logic of the the main exception policy once
        // the property is set
        .to("direct:main-error-handler")
        // Flag the exception as handled
        .handled(true)
    .end()
    // Throw a custom exception to simulate your use case
    .throwException(new CustomException());

from("direct:main-error-handler")
    .log("Property childExceptionFlg set to ${exchangeProperty.childExceptionFlg}");

Result:

INFO  route3 - Property childExceptionFlg set to true
  • Related