Apache Camel Spring Boot - Изящное завершение приложения после обработки маршрутов - PullRequest
2 голосов
/ 02 марта 2020

У меня есть пара маршрутов (маршрут 1 и маршрут 2) в моем приложении Spring Boot. Я изучал, как изящно закрыть приложение после обработки обоих маршрутов. Я сослался на документацию (https://camel.apache.org/manual/latest/graceful-shutdown.html), но не смог добиться того, что мне было нужно. Возможно, мое понимание неверно.

Ниже приведены мои два маршрута

Маршрут 1

 from("timer://runOnce?repeatCount=1")
     .to("{{sql.selectAll}}")
......... SOME PROCESSING
     .to("direct:checkStatus")

Маршрут 2

from("direct:checkStatus")
     .delay(5000)
     .loopDoWhile(CONDITION)
          .process(DO_SOMETHING)
     .end()
     .to("jpa:com.pqr.MyClass)
     .stop();

Я испробовал все эти варианты

1. Автоматическое c отключение через 60 секунд

camel.springboot.duration-max-seconds = 60

Это делает ВСЕГДА отключение 2 маршрутов, но затем ПРЕДУПРЕЖДАЕТ о СРОЧНОМ отключении ExecutorsService, а также не останавливает основной поток, чтобы остановить приложение.

2020-03-01 18:28:25.507  WARN 30279 --- [otTerminateTask] o.a.c.i.e.BaseExecutorServiceManager     : Forcing shutdown of ExecutorService: org.apache.camel.util.concurrent.SizedScheduledExecutorService@17fbfb02[CamelSpringBootTerminateTask] due first await termination elapsed.
2020-03-01 18:28:25.507  WARN 30279 --- [otTerminateTask] o.a.c.i.e.BaseExecutorServiceManager     : Forcing shutdown of ExecutorService: org.apache.camel.util.concurrent.SizedScheduledExecutorService@17fbfb02[CamelSpringBootTerminateTask] due interrupted.
2020-03-01 18:28:25.508  INFO 30279 --- [otTerminateTask] o.a.c.i.e.BaseExecutorServiceManager     : Shutdown of ExecutorService: org.apache.camel.util.concurrent.SizedScheduledExecutorService@17fbfb02[CamelSpringBootTerminateTask] is shutdown: true and terminated: false took: 10.004 seconds.
2020-03-01 18:28:25.508  WARN 30279 --- [otTerminateTask] o.a.c.i.e.BaseExecutorServiceManager     : Forced shutdown of 1 ExecutorService's which has not been shutdown properly (acting as fail-safe)
2020-03-01 18:28:25.508  WARN 30279 --- [otTerminateTask] o.a.c.i.e.BaseExecutorServiceManager     :   forced -> org.apache.camel.util.concurrent.SizedScheduledExecutorService@17fbfb02[CamelSpringBootTerminateTask]

2. Инициируйте отключение от Route2

    from("direct:checkStatus")
            .delay(5000)
            .loopDoWhile(CONDITION)
                 .process(DO_SOMETHING)
            .end()
            .to("jpa:com.pqr.MyClass)
            .process(exchange -> {
                exchange.getContext().getRouteController().stopRoute("route1");
                exchange.getContext().getRouteController().stopRoute("route2");
                System.out.println("Route1 -->"+exchange.getContext().getRouteController().getRouteStatus("route1"));
                System.out.println("Route2 -->"+exchange.getContext().getRouteController().getRouteStatus("route2"));
                exchange.getContext().shutdown();
            });

«route1» изящно остановлен, но «route2» не может быть корректно остановлен с помощью сообщения ниже и ожидает тайм-аут по умолчанию (300 с).

2020-03-01 18:35:29.113  INFO 30504 --- [read #4 - Delay] o.a.c.i.engine.DefaultShutdownStrategy   : Starting to graceful shutdown 1 routes (timeout 300 seconds)
2020-03-01 18:35:29.116  INFO 30504 --- [ - ShutdownTask] o.a.c.i.engine.DefaultShutdownStrategy   : Route: route1 shutdown complete, was consuming from: timer://runOnce?repeatCount=1
2020-03-01 18:35:29.116  INFO 30504 --- [read #4 - Delay] o.a.c.i.engine.DefaultShutdownStrategy   : Graceful shutdown of 1 routes completed in 0 seconds
2020-03-01 18:35:29.117  INFO 30504 --- [read #4 - Delay] o.a.c.s.boot.SpringBootCamelContext      : Route: route1 is stopped, was consuming from: timer://runOnce?repeatCount=1
2020-03-01 18:35:29.117  INFO 30504 --- [read #4 - Delay] o.a.c.i.engine.DefaultShutdownStrategy   : Starting to graceful shutdown 1 routes (timeout 300 seconds)
2020-03-01 18:35:29.118  INFO 30504 --- [ - ShutdownTask] o.a.c.i.engine.DefaultShutdownStrategy   : Waiting as there are still 1 inflight and pending exchanges to complete, timeout in 300 seconds. Inflights per route: [route2 = 1]

Похоже, что ожидается обменное сообщение в ожидании. Нужно ли вручную очищать / использовать обменное сообщение, чтобы очистить и облегчить корректное завершение работы?

Любой из вариантов не останавливает основное приложение. Должен ли я написать собственную стратегию выключения вместо DefaultShutdownStrategy для достижения этой цели? Может кто-нибудь любезно указать на пример, чтобы закрыть приложение Spring Boot после завершения маршрутов? Заранее спасибо !!!

1 Ответ

2 голосов
/ 02 марта 2020

Вы пытались использовать exchange.getContext().stop() для остановки основного приложения?

Чтобы принудительно остановить маршрут без ожидания времени ожидания по умолчанию, вы можете использовать exchange.getContext().stopRoute(routeId, 1L, TimeUnit.SECONDS); или установить время ожидания в секундах context.getShutdownStrategy().setTimeout(30);

...