Search in sources :

Example 1 with AdviceWithTask

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;
}
Also used : AdviceWithRouteBuilder(org.apache.camel.builder.AdviceWithRouteBuilder) AdviceWithTask(org.apache.camel.builder.AdviceWithTask) StatefulService(org.apache.camel.StatefulService)

Aggregations

StatefulService (org.apache.camel.StatefulService)1 AdviceWithRouteBuilder (org.apache.camel.builder.AdviceWithRouteBuilder)1 AdviceWithTask (org.apache.camel.builder.AdviceWithTask)1