Как я могу управлять маршрутом Apache Camel с потребителем без опроса каждые несколько минут - PullRequest
1 голос
/ 25 марта 2020

У меня есть пользовательский Apache Camel-компонент, который состоит из Consumer, который выходит из DefaultConsumer, а не Producer.

У меня есть приложение Spring Boot с несколькими другими маршрутами Camel, которые все прекрасно работают.

Я хотел бы изменить существующий маршрут, чтобы он вызывал пользовательский компонент каждые X минут. Маршрут работает нормально, когда он проходит один раз. Это выглядит так:

JacksonDataFormat enrichedAuditLogEntryFormat = new JacksonDataFormat(EnrichedAuditLogEntry.class);

from("alfaudit://http://acs.local:8080?username=" + user + "&password=" + password)
        .routeId("alfrescoAuditLogToElastic")
        .bean("alfAuditLogEntryEnricher")
        .marshal(enrichedAuditLogEntryFormat)
        .setHeader("indexId", header(AlfAuditConsumer.AUDIT_LOG_ENTRY_ID))
        .to("elasticsearch-rest://elasticsearch?operation=Index&indexName=" + AUDIT_LOG_INDEX + "&indexType=" + AUDIT_LOG_TYPE);

Я борюсь с тем, как реализовать график. Я попытался определить SimpleScheduledRoutePolicy, а затем с помощью setPolicy () на маршруте. Я также пробовал CronScheduledRoutePolicy с помощью setPolicy (). Это может быть полезно, если вам нужно запустить или остановить маршрут по расписанию. Они бегут по моему маршруту один раз, но не делают это повторно. Мне нужно, чтобы маршрут запускался каждые X минут, пока приложение работает.

Затем я попытался добавить кварцевый маршрут, который вызывает существующий маршрут, например:

from("quartz2://fetchaudit?cron=0+0/5+*+*+*+?")
        .process(new Processor() {
            public void process(Exchange exchange) throws Exception {
                CamelContext context = exchange.getContext();
                context.startRoute("alfrescoAuditLogToElastic");
            }
        });

Это работает в первый раз, но когда задание запускается следующим, оно пытается запустить уже запущенный маршрут.

Я надеялся избежать изменения моего пользовательского компонента для расширения из DefaultScheduledPollConsumer, потому что это не всегда использоваться по расписанию. Но, если это лучший способ решить эту проблему, я открыт для этого.

1 Ответ

0 голосов
/ 26 марта 2020

Боюсь, я ничего не знаю о вашем пользовательском компоненте. Но если бы его можно было использовать как производителя и потребителя, вы могли бы попробовать что-то вроде этого. Обратите внимание, что, как производитель, вы можете при желании игнорировать все Message.

//trigger every 60 seconds
from("timer:timerName?period=60000")
  .routeId("alfrescoAuditLogToElastic")
  .to("alfaudit://http://acs.local:8080?username=" + user + "&password=" + password)
  .bean("alfAuditLogEntryEnricher")
  ...
...