Repository: camel Updated Branches: refs/heads/master e621beba5 -> 2f472eda3
CAMEL-11476: spring-boot - routes not loaded wh... ...en setting a management.port Fixes `RouteBuilder` (Java DSL) based routes not loading when setting `management.port` Spring Boot property by removing the 'same application context' check. Also removes `maybeStart` method to start the Camel context from `RoutesCollector`, startup is now handled in `SpringCamelContext`. When customizing the `management.port` configuration option Spring Boot creates a new `ApplicationContext` instance which when started emits a `ContextRefreshedEvent` that is different from the `ApplicationContext` the `RoutesCollector` is initialized with. Due to change in CAMEL-11261, `SpringCamelContext` is started via the same `ContextRefreshedEvent`, at the point the second `ContextRefreshedEvent` emited from the `ApplicationContext`, that `RoutesCollector` is initialized with, `SpringCamelContext` is already started and no Java DSL routes are added to Camel context. Project: http://git-wip-us.apache.org/repos/asf/camel/repo Commit: http://git-wip-us.apache.org/repos/asf/camel/commit/2f472eda Tree: http://git-wip-us.apache.org/repos/asf/camel/tree/2f472eda Diff: http://git-wip-us.apache.org/repos/asf/camel/diff/2f472eda Branch: refs/heads/master Commit: 2f472eda3863ae85bad8fc028805b9340bdb5000 Parents: e621beb Author: Zoran Regvart <zregv...@apache.org> Authored: Thu Jun 29 10:42:07 2017 +0200 Committer: Zoran Regvart <zregv...@apache.org> Committed: Thu Jun 29 14:31:41 2017 +0200 ---------------------------------------------------------------------- .../camel/spring/boot/RoutesCollector.java | 174 ++++++++----------- 1 file changed, 76 insertions(+), 98 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/camel/blob/2f472eda/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/RoutesCollector.java ---------------------------------------------------------------------- diff --git a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/RoutesCollector.java b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/RoutesCollector.java index d14ef06..fdd4601 100644 --- a/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/RoutesCollector.java +++ b/components/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/RoutesCollector.java @@ -75,122 +75,111 @@ public class RoutesCollector implements ApplicationListener<ContextRefreshedEven @Override public void onApplicationEvent(ContextRefreshedEvent event) { - ApplicationContext applicationContext = event.getApplicationContext(); - - // only listen to context refresh of "my" applicationContext - if (this.applicationContext.equals(applicationContext)) { - - CamelContext camelContext = event.getApplicationContext().getBean(CamelContext.class); - - // only add and start Camel if its stopped (initial state) - if (camelContext.getStatus().isStopped()) { - LOG.debug("Post-processing CamelContext bean: {}", camelContext.getName()); - for (RoutesBuilder routesBuilder : applicationContext.getBeansOfType(RoutesBuilder.class, configurationProperties.isIncludeNonSingletons(), true).values()) { - // filter out abstract classes - boolean abs = Modifier.isAbstract(routesBuilder.getClass().getModifiers()); - if (!abs) { - try { - LOG.debug("Injecting following route into the CamelContext: {}", routesBuilder); - camelContext.addRoutes(routesBuilder); - } catch (Exception e) { - throw new CamelSpringBootInitializationException(e); - } + CamelContext camelContext = applicationContext.getBean(CamelContext.class); + + // only add and start Camel if its stopped (initial state) + if (camelContext.getStatus().isStopped()) { + LOG.debug("Post-processing CamelContext bean: {}", camelContext.getName()); + for (RoutesBuilder routesBuilder : applicationContext.getBeansOfType(RoutesBuilder.class, configurationProperties.isIncludeNonSingletons(), true).values()) { + // filter out abstract classes + boolean abs = Modifier.isAbstract(routesBuilder.getClass().getModifiers()); + if (!abs) { + try { + LOG.debug("Injecting following route into the CamelContext: {}", routesBuilder); + camelContext.addRoutes(routesBuilder); + } catch (Exception e) { + throw new CamelSpringBootInitializationException(e); } } + } - try { - boolean scan = !configurationProperties.getXmlRoutes().equals("false"); - if (scan) { - loadXmlRoutes(applicationContext, camelContext, configurationProperties.getXmlRoutes()); - } + try { + boolean scan = !configurationProperties.getXmlRoutes().equals("false"); + if (scan) { + loadXmlRoutes(applicationContext, camelContext, configurationProperties.getXmlRoutes()); + } + + boolean scanRests = !configurationProperties.getXmlRests().equals("false"); + if (scanRests) { + loadXmlRests(applicationContext, camelContext, configurationProperties.getXmlRests()); + } + + for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) { + LOG.debug("CamelContextConfiguration found. Invoking beforeApplicationStart: {}", camelContextConfiguration); + camelContextConfiguration.beforeApplicationStart(camelContext); + } - boolean scanRests = !configurationProperties.getXmlRests().equals("false"); - if (scanRests) { - loadXmlRests(applicationContext, camelContext, configurationProperties.getXmlRests()); + if (configurationProperties.isMainRunController()) { + CamelMainRunController controller = new CamelMainRunController(applicationContext, camelContext); + + if (configurationProperties.getDurationMaxMessages() > 0 || configurationProperties.getDurationMaxIdleSeconds() > 0) { + if (configurationProperties.getDurationMaxMessages() > 0) { + LOG.info("CamelSpringBoot will terminate after processing {} messages", configurationProperties.getDurationMaxMessages()); + } + if (configurationProperties.getDurationMaxIdleSeconds() > 0) { + LOG.info("CamelSpringBoot will terminate after being idle for more {} seconds", configurationProperties.getDurationMaxIdleSeconds()); + } + // register lifecycle so we can trigger to shutdown the JVM when maximum number of messages has been processed + EventNotifier notifier = new MainDurationEventNotifier(camelContext, + configurationProperties.getDurationMaxMessages(), configurationProperties.getDurationMaxIdleSeconds(), + controller.getCompleted(), controller.getLatch(), true); + // register our event notifier + ServiceHelper.startService(notifier); + camelContext.getManagementStrategy().addEventNotifier(notifier); } - for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) { - LOG.debug("CamelContextConfiguration found. Invoking beforeApplicationStart: {}", camelContextConfiguration); - camelContextConfiguration.beforeApplicationStart(camelContext); + if (configurationProperties.getDurationMaxSeconds() > 0) { + LOG.info("CamelSpringBoot will terminate after {} seconds", configurationProperties.getDurationMaxSeconds()); + terminateMainControllerAfter(camelContext, configurationProperties.getDurationMaxSeconds(), + controller.getCompleted(), controller.getLatch()); } - if (configurationProperties.isMainRunController()) { - CamelMainRunController controller = new CamelMainRunController(applicationContext, camelContext); + // controller will start Camel + LOG.info("Starting CamelMainRunController to ensure the main thread keeps running"); + controller.start(); + } else { + if (applicationContext instanceof ConfigurableApplicationContext) { + ConfigurableApplicationContext cac = (ConfigurableApplicationContext) applicationContext; + + if (configurationProperties.getDurationMaxSeconds() > 0) { + LOG.info("CamelSpringBoot will terminate after {} seconds", configurationProperties.getDurationMaxSeconds()); + terminateApplicationContext(cac, camelContext, configurationProperties.getDurationMaxSeconds()); + } if (configurationProperties.getDurationMaxMessages() > 0 || configurationProperties.getDurationMaxIdleSeconds() > 0) { + if (configurationProperties.getDurationMaxMessages() > 0) { LOG.info("CamelSpringBoot will terminate after processing {} messages", configurationProperties.getDurationMaxMessages()); } if (configurationProperties.getDurationMaxIdleSeconds() > 0) { LOG.info("CamelSpringBoot will terminate after being idle for more {} seconds", configurationProperties.getDurationMaxIdleSeconds()); } + // needed by MainDurationEventNotifier to signal when we have processed the max messages + final AtomicBoolean completed = new AtomicBoolean(); + final CountDownLatch latch = new CountDownLatch(1); + // register lifecycle so we can trigger to shutdown the JVM when maximum number of messages has been processed EventNotifier notifier = new MainDurationEventNotifier(camelContext, configurationProperties.getDurationMaxMessages(), configurationProperties.getDurationMaxIdleSeconds(), - controller.getCompleted(), controller.getLatch(), true); + completed, latch, false); // register our event notifier ServiceHelper.startService(notifier); camelContext.getManagementStrategy().addEventNotifier(notifier); - } - if (configurationProperties.getDurationMaxSeconds() > 0) { - LOG.info("CamelSpringBoot will terminate after {} seconds", configurationProperties.getDurationMaxSeconds()); - terminateMainControllerAfter(camelContext, configurationProperties.getDurationMaxSeconds(), - controller.getCompleted(), controller.getLatch()); + terminateApplicationContext(cac, camelContext, latch); } - - // controller will start Camel - LOG.info("Starting CamelMainRunController to ensure the main thread keeps running"); - controller.start(); - } else { - if (applicationContext instanceof ConfigurableApplicationContext) { - ConfigurableApplicationContext cac = (ConfigurableApplicationContext) applicationContext; - - if (configurationProperties.getDurationMaxSeconds() > 0) { - LOG.info("CamelSpringBoot will terminate after {} seconds", configurationProperties.getDurationMaxSeconds()); - terminateApplicationContext(cac, camelContext, configurationProperties.getDurationMaxSeconds()); - } - - if (configurationProperties.getDurationMaxMessages() > 0 || configurationProperties.getDurationMaxIdleSeconds() > 0) { - - if (configurationProperties.getDurationMaxMessages() > 0) { - LOG.info("CamelSpringBoot will terminate after processing {} messages", configurationProperties.getDurationMaxMessages()); - } - if (configurationProperties.getDurationMaxIdleSeconds() > 0) { - LOG.info("CamelSpringBoot will terminate after being idle for more {} seconds", configurationProperties.getDurationMaxIdleSeconds()); - } - // needed by MainDurationEventNotifier to signal when we have processed the max messages - final AtomicBoolean completed = new AtomicBoolean(); - final CountDownLatch latch = new CountDownLatch(1); - - // register lifecycle so we can trigger to shutdown the JVM when maximum number of messages has been processed - EventNotifier notifier = new MainDurationEventNotifier(camelContext, - configurationProperties.getDurationMaxMessages(), configurationProperties.getDurationMaxIdleSeconds(), - completed, latch, false); - // register our event notifier - ServiceHelper.startService(notifier); - camelContext.getManagementStrategy().addEventNotifier(notifier); - - terminateApplicationContext(cac, camelContext, latch); - } - } - - // start camel manually - maybeStart(camelContext); } + } - for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) { - LOG.debug("CamelContextConfiguration found. Invoking afterApplicationStart: {}", camelContextConfiguration); - camelContextConfiguration.afterApplicationStart(camelContext); - } - } catch (Exception e) { - throw new CamelSpringBootInitializationException(e); + for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) { + LOG.debug("CamelContextConfiguration found. Invoking afterApplicationStart: {}", camelContextConfiguration); + camelContextConfiguration.afterApplicationStart(camelContext); } - } else { - LOG.debug("Camel already started, not adding routes."); + } catch (Exception e) { + throw new CamelSpringBootInitializationException(e); } } else { - LOG.debug("Ignore ContextRefreshedEvent: {}", event); + LOG.debug("Camel already started, not adding routes."); } } @@ -206,17 +195,6 @@ public class RoutesCollector implements ApplicationListener<ContextRefreshedEven return LOWEST_PRECEDENCE - 1; } - private void maybeStart(CamelContext camelContext) throws Exception { - // for example from unit testing we want to start Camel later and not when Spring framework - // publish a ContextRefreshedEvent - boolean skip = "true".equalsIgnoreCase(System.getProperty("skipStartingCamelContext")); - if (skip) { - LOG.info("Skipping starting CamelContext as system property skipStartingCamelContext is set to be true."); - } else { - camelContext.start(); - } - } - // Helpers private void loadXmlRoutes(ApplicationContext applicationContext, CamelContext camelContext, String directory) throws Exception {