Uploaded image for project: 'Camel'
  1. Camel
  2. CAMEL-8646

Camel doesn't allow intercept and advice on the same route

    Details

    • Type: Bug
    • Status: Resolved
    • Priority: Major
    • Resolution: Invalid
    • Affects Version/s: 2.15.0
    • Fix Version/s: 2.15.3, 2.16.0
    • Component/s: camel-core
    • Labels:
      None
    • Estimated Complexity:
      Unknown

      Description

      Let's assume we have a route, defined in a RouteBuilder. It allows us to define an interceptor that would be executed before every route step, via an intercept(Processor) call.

      Routes can also have an advice attached to them, via RouteDefinition.adviceWith(AdviceWithRouteBuilder) call.

      If these two methods of weaving custom processing into existing routes are combined, Camel throws an exception:

      Exception in thread "main" java.lang.IllegalArgumentException: There are no outputs which matches: * in the route: Route(main)[[From[direct:main]] -> [Intercept[[Log[Intercept ${body} ${headers}]]], Log[Main ${body} ${headers}]]]
      	at org.apache.camel.builder.AdviceWithTasks$3.task(AdviceWithTasks.java:257)
      	at org.apache.camel.model.RouteDefinition.adviceWith(RouteDefinition.java:270)
      	at camel.Test.main(Test.java:20)
      

      Simple test to illustrate the issue:

      import org.apache.camel.builder.AdviceWithRouteBuilder;
      import org.apache.camel.builder.RouteBuilder;
      import org.apache.camel.impl.DefaultCamelContext;
      import org.apache.camel.model.ModelCamelContext;
      
      public class Test {
      	public static void main(String[] args) throws Exception {
      		ModelCamelContext context = new DefaultCamelContext();
      		RouteBuilder route = new RouteBuilder() {
      			@Override
      			public void configure() throws Exception {
      				from("direct:advice").log("Advice ${body} ${headers}");
      				from("direct:main").routeId("main").log("Main ${body} ${headers}");
      			}
      		};
      		route.intercept().log("Intercept ${body} ${headers}");
      		context.addRoutes(route);
      		context.getRouteDefinition("main").adviceWith(context, new AdviceWithRouteBuilder() {
      			@Override
      			public void configure() throws Exception {
      				weaveAddFirst().to("direct:advice");
      			}
      		});
      	}
      }
      

        Attachments

        1. test.zip
          8 kB
          Alex Savitsky

          Activity

            People

            • Assignee:
              davsclaus Claus Ibsen
              Reporter:
              alex_savitsky Alex Savitsky
            • Votes:
              0 Vote for this issue
              Watchers:
              2 Start watching this issue

              Dates

              • Created:
                Updated:
                Resolved: