Reputation: 441
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
the LoggingPolicy is applied to all routes in all RouteBuilders inheriting form BaseRouteBuilder
(in this example HelloRoute
and ByeRoute
but not AnotherRoute
)
the constructor parameter (greeting
) defaults to "Hello"
but could be overriden in the routebuilder.
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
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