Apache Camel quartz2 осечка cron

Я использую 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 Буду признателен за любую помощь :)

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
486
1

Ответы 1

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

Вместо остановки маршрута с помощью 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();
        }
    }

}

Другие вопросы по теме