Как изящно остановить верблюжий контекст в приложении Springboot - PullRequest
0 голосов
/ 28 августа 2018

Я использую Camel с Spring Boot. Контекст верблюда запускается при запуске приложения и продолжает работать. При закрытии приложения, как закрыть контекст верблюда.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Я написал собственное решение, реализовав SpringL SmartCifeCycle, который ожидает остановки других пружинных компонентов, прежде чем завершить работу CamelContext. Используйте этот класс как есть, он будет работать нормально.

@Component
public class SpringBootCamelShutDown implements SmartLifecycle {

    private static final Logger log = LoggerFactory.getLogger(SpringBootCamelShutDown.class);

    @Autowired
    private ApplicationContext appContext;

    @Override
    public void start() {}

    @Override
    public void stop() {}

    @Override
    public boolean isRunning() {
        SpringCamelContext context = (SpringCamelContext)appContext.getBean(CamelContext.class);
        return context.isStarted();
    }

    @Override
    public boolean isAutoStartup() {
        return true;
    }

    @Override
    public void stop(Runnable runnable) {
        SpringCamelContext context = (SpringCamelContext)appContext.getBean(CamelContext.class);
        if (!isRunning()) {
            log.info("Camel context already stopped");
            return;
        }

        log.info("Stopping camel context. Will wait until it is actually stopped");

        try {
            context.stop();
        } catch (Exception e) {
            log.error("Error shutting down camel context",e) ;
            return;
        }

        while(isRunning()) {
            try {
                TimeUnit.SECONDS.sleep(1);
            } catch (InterruptedException e) {
                log.error("Error shutting down camel context",e) ;
            }
        };

        // Calling this method is necessary to make sure spring has been notified on successful
        // completion of stop method by reducing the latch countdown value.
        runnable.run();
    }

    @Override
    public int getPhase() {
        return Integer.MAX_VALUE;
    }
}
0 голосов
/ 28 августа 2018

Вы можете использовать метод остановки класса CamelContext.

@Autowired CamelContext camelContext;

stop () - для выключения (остановит все маршруты / компоненты / конечные точки и т. Д. И очистит внутреннее состояние / кэш)

См. http://camel.apache.org/spring-boot.html и http://camel.apache.org/maven/current/camel-core/apidocs/org/apache/camel/CamelContext.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...