Apache Camel Quartz2 Cron осечка - PullRequest
0 голосов
/ 23 мая 2018

Я использую Apache Camel с весенней загрузкой и файлом camel-config.xml.Я создал простой маршрут, который запускается каждую секунду и запускает метод класса:

<camelContext xmlns="http://camel.apache.org/schema/spring" id="myContext" trace="true" streamCache="true" useMDCLogging="true">       
    <route id="testCron">
        <from uri="quartz2://TestCron?cron=0/1 * * * * ?" />
        <to uri="bean:folder.MyClass?method=test" />
    </route>
</camelContext>

У класса просто есть счетчик int, который увеличивается и отображается:

package folder;

public class MyClass {

    private static int count = 0;

    public static void test(Exchange exchange) throws Exception {
        count = count + 1;
        System.out.println(count);
    }    

}

У меня есть другая частькода (показ не имеет значения), который может запускать и останавливать вышеуказанный маршрут.Проблема, с которой я сталкиваюсь, заключается в остановке маршрута, ожидании 5 секунд и запуске его обратно.

Вместо того, чтобы продолжать, где он оставил счет, он перехватывает каждую итерацию, которую не выполнял, пока маршрут был остановлен.

Я много читал, пытаясь решить эту проблему.То, что я узнал, было ниже:

  • То, что происходит, называется «пропуском огня»
  • Существует параметр, который позволяет настроить инструкции пропуска зажигания
  • Согласно ApacheВ документации Camel вы не можете использовать параметры trigger.XXX (которые позволят настроить инструкции пропуска зажигания), если вы используете выражение cron.
  • Согласно документации Apache Camel, пропуски зажигания будут записываться только в том случае, если кварцв кластерном режиме.
  • Вы можете настроить свойства кварца для отключения кластерного режима (он мне не нужен).

Что я пытался без удачи:

  • Создан файл свойств кварца с org.quartz.jobStore.isClustered: false.Я не уверен, что он был поднят (поместите его в src / resources и создайте bean-компонент, указывающий на него).Это не решило проблему.
  • Попытка установить misfireInstruction в качестве опции запуска в маршруте. Quartz2: // TestCron? Trigger.misfireInstruction = 2 & cron = 0/1 * * * *? "

У меня совершенно нет вариантов: x Буду признателен за любую помощь :)

1 Ответ

0 голосов
/ 23 мая 2018

Мне не удалось найти способ изменить инструкции по пропускам зажигания, но я нашел обходной путь.

Вместо остановки маршрута с помощью context.stopRoute (routeId) я теперь останавливаю конечную точку:

public static void stopRoute(Exchange exchange) throws Exception {

    String beanId = (String) exchange.getIn().getHeader("beanId");
    String routeId = (String) exchange.getIn().getHeader("routeId");

    SpringCamelContext context = (SpringCamelContext) exchange.getContext().getRegistry().lookupByName(beanId);

    for (Route route : context.getRoutes()) {
        if (route.getId().equals(routeId)) {
            route.getEndpoint().stop();
        }
    }

}
...