Jirmed
Jirmed

Reputation: 441

Default RoutePolicy in Apache Camel

I have following scenario

RoutePolicy:

@Slf4j
@RequiredArgsConstructor
public class LoggingPolicy extends RoutePolicySupport {
    private final String greeting;

    @Override
    public void onExchangeBegin(Route route, Exchange exchange) {
        super.onExchangeBegin(route, exchange);
        log.info("%s from LoggingPolicy".formatted(greeting));
    }
}

BaseRouteBuilder:

public abstract class BaseRouteBuilder
    extends RouteBuilder {
    @Override
    public void configure() throws Exception {

        onException()
            .handled(true)
            .log("Exception occured")
            .end();

        configRoutes();
    }

    abstract void configRoutes();
}

Two implementations:

@Component
public class HelloRouteBuilder extends BaseRouteBuilder {
    @Override
    void configRoutes() {
        from("timer:hello?repeatCount=1")
            .routeId("HelloRoute")
            .routePolicy( new LoggingPolicy("Hello"))
            .log("HelloRoute Completed");
    }
}


@Component
public class ByeRouteBuilder extends BaseRouteBuilder {
    @Override
    void configRoutes() {
        from("timer:bye?repeatCount=1")
            .routeId("ByeRoute")
            .routePolicy( new LoggingPolicy("Bye"))
            .log("ByeRoute Completed");
    }
}

and finaly yet another RouteBuilder - not inherited from BaseRouteBuilder

@Component
public class AnotherRouteBuilder extends RouteBuilder {
    @Override
    public void configure() throws Exception {
        from("timer:another?repeatCount=1")
            .routeId("AnotherRoute")
            .log("AnotherRoute Completed");
    }
}

Every works as expected.

What I want to do now is to delegate the LoggingPolicy to the BaseRouteBuilder so that

In my real use case I have 100+ RouteBuilders and I want to add LoggingPolicy to all of them. Most of them with default parameters but i need to override the parameters for a few of routes.

Upvotes: 0

Views: 25

Answers (1)

Jirmed
Jirmed

Reputation: 441

After quite some experimenting i found following solution

public abstract class BaseRouteBuilder
    extends RouteBuilder {
    @Override
    public void configure() throws Exception {

        onException()
            .handled(true)
            .log("Exception occurred")
            .end();


        configRoutes();
        configureRoutes(getContext()).getRoutes()
            .forEach(route -> route.routePolicy(
                getLoggingPolicy()));
    }

    abstract void configRoutes();

    protected RoutePolicy getLoggingPolicy() {
        return new LoggingPolicy(
            getLoggingPolicyGreeting());
    }

    protected String getLoggingPolicyGreeting() {
        return "Hola"; // Default greeting
    }
}

Now in the child routes i can override getLoggingPolicyGreeting to modify the default greeting for the RouteBuilder or even the entire LoggingPolicy using getLoggingPolicyGreeting like

@Component
public class ByeRouteBuilder extends BaseRouteBuilder {
    @Override
    void configRoutes() {
        from("timer:bye?repeatCount=1")
            .routeId("ByeRoute")
            .log("ByeRoute Completed");
    }

    @Override
    protected String getLoggingPolicyGreeting() {
        return "Bye";
    }
}

Upvotes: 0

Related Questions