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