Hello,
We are upgrading from Camel 3.18.4 to 3.22.4 to pickup some important bug fixes 
but noticed a new problem. When we are instantiating a route in a spring-boot 
(2.6.2) app from a route-template the Java builder intermittently fails 3 out 
of 4 times. As a workaround we switched to using the Java DSL way to create the 
route and this seems to work fine.

This Java DSL code works:

final TemplatedRouteDefinition route = templatedRoute("template1")
              .routeId("route-template1-id")
              .parameter("param1", queueName)
              .parameter("param2", restApiEndpoint));
      LOG.info("buildTemplatedRoute() created templated route: {}", 
route.getRouteId());

But this Java builder code fails intermittently (3 out of 4 times):

      final String route = TemplatedRouteBuilder.builder(camelContext, 
"template1")
              .routeId("route-template1-id")
              .parameter("param1", queueName)
              .parameter("param2", restApiEndpoint)
              .add();
      LOG.application.info("buildTemplatedRoute() created templated route: {}", 
route);

When the service starts and calls the Camel 3.22.4 builder code, it fails and 
throws this:

org.apache.camel.spring.boot.CamelSpringBootInitializationException: 
java.lang.IllegalArgumentException: Cannot find RouteTemplate with id template1
        at 
org.apache.camel.spring.boot.CamelSpringBootApplicationListener.onApplicationEvent(CamelSpringBootApplicationListener.java:212)
 ~[camel-spring-boot-3.22.4.jar:3.22.4]
        at 
org.apache.camel.spring.boot.CamelSpringBootApplicationListener.onApplicationEvent(CamelSpringBootApplicationListener.java:58)
 ~[camel-spring-boot-3.22.4.jar:3.22.4]
        at 
org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener(SimpleApplicationEventMulticaster.java:176)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener(SimpleApplicationEventMulticaster.java:169)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent(SimpleApplicationEventMulticaster.java:143)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:421)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.context.support.AbstractApplicationContext.publishEvent(AbstractApplicationContext.java:378)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.context.support.AbstractApplicationContext.finishRefresh(AbstractApplicationContext.java:938)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:586)
 ~[spring-context-5.3.14.jar:5.3.14]
        at 
org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
 ~[spring-boot-2.6.2.jar:2.6.2]
        at 
org.springframework.boot.SpringApplication.refresh(SpringApplication.java:730) 
~[spring-boot-2.6.2.jar:2.6.2]
        at 
org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:412)
 ~[spring-boot-2.6.2.jar:2.6.2]
        at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:302) 
~[spring-boot-2.6.2.jar:2.6.2]
        at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:1301) 
~[spring-boot-2.6.2.jar:2.6.2]
        at 
org.springframework.boot.SpringApplication.run(SpringApplication.java:1290) 
~[spring-boot-2.6.2.jar:2.6.2]
        at 
ca.gc.esdc.interop.interfaces.cancelled_payments.payment.sps_f2r_ent.service.SpsMessageProcessorApplication.main(SpsMessageProcessorApplication.java:25)
 ~[classes/:na]
Caused by: java.lang.IllegalArgumentException: Cannot find RouteTemplate with 
id ConsumerRouteDefaultTemplate
        at 
org.apache.camel.impl.DefaultModel.addRouteFromTemplate(DefaultModel.java:419) 
~[camel-core-engine-3.22.4.jar:3.22.4]
        at 
org.apache.camel.impl.DefaultCamelContext.addRouteFromTemplate(DefaultCamelContext.java:502)
 ~[camel-core-engine-3.22.4.jar:3.22.4]
        at 
org.apache.camel.builder.TemplatedRouteBuilder.add(TemplatedRouteBuilder.java:179)
 ~[camel-core-model-3.22.4.jar:3.22.4]
        at 
ca.gc.esdc.interop.interfaces.cancelled_payments.payment.sps_f2r_ent.service.routes.SpsMessageProcessorRoute.buildTemplatedRoute(SpsMessageProcessorRoute.java:91)
 ~[classes/:na]
        at 
ca.gc.esdc.interop.interfaces.cancelled_payments.payment.sps_f2r_ent.service.routes.SpsMessageProcessorRoute.defineRoutes(SpsMessageProcessorRoute.java:59)
 ~[classes/:na]
        at 
ca.gc.esdc.interop.base.messageprocessor.routes.AbstractRoute.configure(AbstractRoute.java:38)
 ~[base-message-processor-1.3.0-DAN.jar:na]
        at 
org.apache.camel.builder.RouteBuilder.checkInitialized(RouteBuilder.java:723) 
~[camel-core-model-3.22.4.jar:3.22.4]
        at 
org.apache.camel.builder.RouteBuilder.configureRoutes(RouteBuilder.java:668) 
~[camel-core-model-3.22.4.jar:3.22.4]
        at 
org.apache.camel.builder.RouteBuilder.addRoutesToCamelContext(RouteBuilder.java:600)
 ~[camel-core-model-3.22.4.jar:3.22.4]
        at 
org.apache.camel.impl.engine.AbstractCamelContext.addRoutes(AbstractCamelContext.java:1212)
 ~[camel-base-engine-3.22.4.jar:3.22.4]
        at 
org.apache.camel.main.RoutesConfigurer.addDiscoveredRoutes(RoutesConfigurer.java:247)
 ~[camel-main-3.22.4.jar:3.22.4]
        at 
org.apache.camel.main.RoutesConfigurer.configureRoutes(RoutesConfigurer.java:222)
 ~[camel-main-3.22.4.jar:3.22.4]
        at 
org.apache.camel.spring.boot.CamelSpringBootApplicationListener.onApplicationEvent(CamelSpringBootApplicationListener.java:106)
 ~[camel-spring-boot-3.22.4.jar:3.22.4]

So it appears that there is some timing issue that makes this fail 
intermittently since the template cannot be found.

One extra complication is that we have coded the route-template definitions in 
a dependent jar that is pulled into our spring-boot service by our maven build. 
So the code that actually builds and runs the route is in the service.
We added this to our service main class in order to find the route in the 
dependent jar:

@ComponentScan(basePackages = {
      "package-for-the-dependent-jar",
      "package-for-the-spring-boot-service"  // must be after the dep. jar 
package
      })

Wonder if what we see now with the builder is a known problem in Camel 3.22.4 ?
Any comments/thoughts?
Thanks,
...jvh

Reply via email to