Search in sources :

Example 1 with SimpleMainShutdownStrategy

use of org.apache.camel.main.SimpleMainShutdownStrategy in project camel-spring-boot by apache.

the class CamelSpringBootApplicationListener method onApplicationEvent.

// Overridden
@Override
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(camelContext.adapt(ExtendedCamelContext.class).getBeanPostProcessor());
            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 {
                        // 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 " + e.getMessage() + ". This exception is ignored", 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.");
    }
}
Also used : ExtendedCamelContext(org.apache.camel.ExtendedCamelContext) CamelContext(org.apache.camel.CamelContext) ConfigurableApplicationContext(org.springframework.context.ConfigurableApplicationContext) StartupListener(org.apache.camel.StartupListener) RoutesConfigurer(org.apache.camel.main.RoutesConfigurer) MainDurationEventNotifier(org.apache.camel.main.MainDurationEventNotifier) CamelEvent(org.apache.camel.spi.CamelEvent) EventNotifierSupport(org.apache.camel.support.EventNotifierSupport) MainDurationEventNotifier(org.apache.camel.main.MainDurationEventNotifier) EventNotifier(org.apache.camel.spi.EventNotifier) SimpleMainShutdownStrategy(org.apache.camel.main.SimpleMainShutdownStrategy) MainShutdownStrategy(org.apache.camel.main.MainShutdownStrategy) SimpleMainShutdownStrategy(org.apache.camel.main.SimpleMainShutdownStrategy)

Example 2 with SimpleMainShutdownStrategy

use of org.apache.camel.main.SimpleMainShutdownStrategy in project camel-quarkus by apache.

the class CamelMain method doInit.

@Override
protected void doInit() throws Exception {
    MainShutdownStrategy shutdownStrategy = new SimpleMainShutdownStrategy();
    shutdownStrategy.addShutdownListener(() -> Quarkus.asyncExit(getExitCode()));
    setShutdownStrategy(shutdownStrategy);
    super.doInit();
    initCamelContext();
}
Also used : SimpleMainShutdownStrategy(org.apache.camel.main.SimpleMainShutdownStrategy) SimpleMainShutdownStrategy(org.apache.camel.main.SimpleMainShutdownStrategy) MainShutdownStrategy(org.apache.camel.main.MainShutdownStrategy)

Aggregations

MainShutdownStrategy (org.apache.camel.main.MainShutdownStrategy)2 SimpleMainShutdownStrategy (org.apache.camel.main.SimpleMainShutdownStrategy)2 CamelContext (org.apache.camel.CamelContext)1 ExtendedCamelContext (org.apache.camel.ExtendedCamelContext)1 StartupListener (org.apache.camel.StartupListener)1 MainDurationEventNotifier (org.apache.camel.main.MainDurationEventNotifier)1 RoutesConfigurer (org.apache.camel.main.RoutesConfigurer)1 CamelEvent (org.apache.camel.spi.CamelEvent)1 EventNotifier (org.apache.camel.spi.EventNotifier)1 EventNotifierSupport (org.apache.camel.support.EventNotifierSupport)1 ConfigurableApplicationContext (org.springframework.context.ConfigurableApplicationContext)1