У меня есть контекст Camel со многими маршрутами, который начинается каждые 15 м с Компонентом таймера.
Эти маршруты устанавливают некоторые свойства взамен (целевой хост, запрос и текущая дата, для которых я использую процессор, чтобы получить дату, -12 часов и преобразование в GMT).
После установки этих свойств с помощью Direct вызывается другой маршрут для выполнения HTTP Get.Когда запрос завершен, вызывается другой маршрут для отправки возврата на Artemis ActiveMQ.
Проект развернут на Wildfly 13.
Проблема заключается в следующем: иногда маршруты просто замирают.Не начинайте через 15 минут.Когда я пытаюсь остановить / запустить маршрут, я получаю следующий журнал:
[0m[0m08:27:45,230 INFO [org.apache.camel.impl.DefaultShutdownStrategy] (Camel (camel-example) thread #70 - ShutdownTask) There are 1 inflight exchanges: InflightExchange: [exchangeId=ID-exchange-ID, fromRouteId=Route1, routeId=GetDataAutoBySinceTime, nodeId=toD7, elapsed=0, duration=216958569]
[0m[0m08:27:46,231 INFO [org.apache.camel.impl.DefaultShutdownStrategy] (Camel (camel-example) thread #70 - ShutdownTask) Waiting as there are still 1 inflight and pending exchanges to complete, timeout in 299 seconds. Inflights per route: [Route1 = 1]
[0m[0m08:27:46,231 INFO [org.apache.camel.impl.DefaultShutdownStrategy] (Camel (camel-example) thread #70 - ShutdownTask) There are 1 inflight exchanges: InflightExchange: [exchangeId=ID-exchange-ID, fromRouteId=Route1, routeId=GetDataAutoBySinceTime, nodeId=toD7, elapsed=0, duration=216959570]
[0m[0m08:27:47,231 INFO [org.apache.camel.impl.DefaultShutdownStrategy] (Camel (camel-example) thread #70 - ShutdownTask) Waiting as there are still 1 inflight and pending exchanges to complete, timeout in 298 seconds. Inflights per route: [Route1 = 1]
Я не знаю, зависли ли некоторые процессы, что делает невозможным запуск других процессов.
Iдумал удалить общие маршруты (PostMessageInActiveMQ
и GetDataAutomaticallyBySinceTime
и реализовать тот же код в других маршрутах (Route1
, Route2
и Route3
), но я не думаю, что это лучший подход.
Маршруты:
Маршрут1 (Маршрут2 и Маршрут3 почти одинаковы, просто измените значения свойств)
from("timer:Route1Timer?period=15m")
.routeId("Route1")
.autoStartup(false)
.setProperty("targetAddress", simple("hostname.route1"))
.process(new GetCurrentDate())
.setProperty("query",
simple("DataQuery%26URI=Route1%26format=xml%26Mode=since-time%26p1=${header.currentDate}"))
.to("direct:GetDataAutoBySinceTime");
GetDataAutomaticsBySinceTime
from("direct:GetDataAutoBySinceTime")
.routeId("GetDataAutoBySinceTime")
.autoStartup(true)
.removeHeaders("*")
.setHeader(Exchange.HTTP_METHOD, constant("GET"))
.toD("http4:${header.targetAddress}/command=${header.query}%26httpClient.socketTimeout=3000")
.convertBodyTo(String.class, "utf-8")
.to("direct:PostMessageInActiveMQ");
PostMessageInActiveMQ
CamelArtemisComponent components = new CamelArtemisComponent();
getContext().addComponent("artemis", components.getArtemisComponent());
from("direct:PostMessageInActiveMQ")
.routeId("PostMessageInActiveMQ")
.autoStartup(true)
.convertBodyTo(String.class, "utf-8")
.inOnly("artemis:ARTEMIS.QUEUE");
Весь код: https://github.com/vitorvr/camel-example
РЕДАКТИРОВАТЬ:
Версия для верблюдов: 2.22.0