in core/camel-spring-boot/src/main/java/org/apache/camel/spring/boot/CamelSpringBootApplicationListener.java [86:219]
public void onApplicationEvent(ContextRefreshedEvent event) {
CamelContext camelContext = applicationContext.getBean(CamelContext.class);
// only add and start Camel if its stopped (initial state)
if (event.getApplicationContext() == this.applicationContext
&& camelContext.getStatus().isStopped()) {
LOG.debug("Post-processing CamelContext bean: {}", camelContext.getName());
try {
// we can use the default routes configurer
RoutesConfigurer configurer = new RoutesConfigurer();
if (configurationProperties.isRoutesCollectorEnabled()) {
configurer.setRoutesCollector(springBootRoutesCollector);
}
configurer.setBeanPostProcessor(PluginHelper.getBeanPostProcessor(camelContext));
configurer.setJavaRoutesExcludePattern(configurationProperties.getJavaRoutesExcludePattern());
configurer.setJavaRoutesIncludePattern(configurationProperties.getJavaRoutesIncludePattern());
configurer.setRoutesExcludePattern(configurationProperties.getRoutesExcludePattern());
configurer.setRoutesIncludePattern(configurationProperties.getRoutesIncludePattern());
configurer.configureRoutes(camelContext);
for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) {
LOG.debug("CamelContextConfiguration found. Invoking beforeApplicationStart: {}", camelContextConfiguration);
camelContextConfiguration.beforeApplicationStart(camelContext);
}
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.getMainShutdownStrategy(), true, configurationProperties.isRoutesReloadRestartDuration(),
configurationProperties.getDurationMaxAction());
// 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.getMainShutdownStrategy(), controller.getMainCompleteTask());
}
camelContext.addStartupListener(new StartupListener() {
@Override
public void onCamelContextStarted(CamelContext context, boolean alreadyStarted) throws Exception {
// run the CamelMainRunController after the context has been started
// this way we ensure that NO_START flag is honoured as it's set as
// a thread local variable of the thread CamelMainRunController is
// not running on
if (!alreadyStarted) {
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 MainShutdownStrategy strategy = new SimpleMainShutdownStrategy();
// 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(),
strategy, false,
configurationProperties.isRoutesReloadRestartDuration(),
configurationProperties.getDurationMaxAction());
// register our event notifier
ServiceHelper.startService(notifier);
camelContext.getManagementStrategy().addEventNotifier(notifier);
terminateApplicationContext(cac, camelContext, strategy);
}
}
}
if (!camelContextConfigurations.isEmpty()) {
// we want to call these notifications just after CamelContext has been fully started
// so use an event notifier to trigger when this happens
camelContext.getManagementStrategy().addEventNotifier(new EventNotifierSupport() {
@Override
public void notify(CamelEvent eventObject) throws Exception {
for (CamelContextConfiguration camelContextConfiguration : camelContextConfigurations) {
LOG.debug("CamelContextConfiguration found. Invoking afterApplicationStart: {}", camelContextConfiguration);
try {
camelContextConfiguration.afterApplicationStart(camelContext);
} catch (Exception e) {
LOG.warn("Error during calling afterApplicationStart due {}. This exception is ignored",
e.getMessage(), e);
}
}
}
@Override
public boolean isEnabled(CamelEvent eventObject) {
return eventObject.getType() == Type.CamelContextStarted;
}
});
}
} catch (Exception e) {
throw new CamelSpringBootInitializationException(e);
}
} else {
LOG.debug("Camel already started, not adding routes.");
}
}