use of org.apache.camel.builder.AdviceWithTask in project camel by apache.
the class RouteDefinition method adviceWith.
/**
* Advices this route with the route builder.
* <p/>
* <b>Important:</b> It is recommended to only advice a given route once (you can of course advice multiple routes).
* If you do it multiple times, then it may not work as expected, especially when any kind of error handling is involved.
* The Camel team plan for Camel 3.0 to support this as internal refactorings in the routing engine is needed to support this properly.
* <p/>
* You can use a regular {@link RouteBuilder} but the specialized {@link org.apache.camel.builder.AdviceWithRouteBuilder}
* has additional features when using the <a href="http://camel.apache.org/advicewith.html">advice with</a> feature.
* We therefore suggest you to use the {@link org.apache.camel.builder.AdviceWithRouteBuilder}.
* <p/>
* The advice process will add the interceptors, on exceptions, on completions etc. configured
* from the route builder to this route.
* <p/>
* This is mostly used for testing purpose to add interceptors and the likes to an existing route.
* <p/>
* Will stop and remove the old route from camel context and add and start this new advised route.
*
* @param camelContext the camel context
* @param builder the route builder
* @return a new route which is this route merged with the route builder
* @throws Exception can be thrown from the route builder
* @see AdviceWithRouteBuilder
*/
@SuppressWarnings("deprecation")
public RouteDefinition adviceWith(ModelCamelContext camelContext, RouteBuilder builder) throws Exception {
ObjectHelper.notNull(camelContext, "CamelContext");
ObjectHelper.notNull(builder, "RouteBuilder");
log.debug("AdviceWith route before: {}", this);
// and offer features to manipulate the route directly
if (builder instanceof AdviceWithRouteBuilder) {
((AdviceWithRouteBuilder) builder).setOriginalRoute(this);
}
// configure and prepare the routes from the builder
RoutesDefinition routes = builder.configureRoutes(camelContext);
log.debug("AdviceWith routes: {}", routes);
// we can only advice with a route builder without any routes
if (!builder.getRouteCollection().getRoutes().isEmpty()) {
throw new IllegalArgumentException("You can only advice from a RouteBuilder which has no existing routes." + " Remove all routes from the route builder.");
}
// context scoped error handler, in case no error handlers was configured
if (builder.getRouteCollection().getErrorHandlerBuilder() != null && camelContext.getErrorHandlerBuilder() != builder.getRouteCollection().getErrorHandlerBuilder()) {
throw new IllegalArgumentException("You can not advice with error handlers. Remove the error handlers from the route builder.");
}
// stop and remove this existing route
camelContext.removeRouteDefinition(this);
// any advice with tasks we should execute first?
if (builder instanceof AdviceWithRouteBuilder) {
List<AdviceWithTask> tasks = ((AdviceWithRouteBuilder) builder).getAdviceWithTasks();
for (AdviceWithTask task : tasks) {
task.task();
}
}
// now merge which also ensures that interceptors and the likes get mixed in correctly as well
RouteDefinition merged = routes.route(this);
// add the new merged route
camelContext.getRouteDefinitions().add(0, merged);
// log the merged route at info level to make it easier to end users to spot any mistakes they may have made
log.info("AdviceWith route after: " + merged);
// If the camel context is started then we start the route
if (camelContext instanceof StatefulService) {
StatefulService service = (StatefulService) camelContext;
if (service.isStarted()) {
camelContext.startRoute(merged);
}
}
return merged;
}
Aggregations