Apache Camel quartz2 cron失火

时间:2018-05-23 07:47:42

标签: java cron apache-camel quartz misfire-instruction

我正在使用带有spring boot和camel-config.xml文件的Apache Camel。 我创建了一个每秒运行的简单路由并运行一个类方法:

<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秒并重新开始。

它不会继续离开计数的位置,而是捕获路径停止时未执行的每次迭代。

我已经阅读了很多试图解决这个问题。我学到的是吼叫:

  • 所发生的事情被称为&#34; misfire&#34;
  • 有一个参数可以配置失火指令
  • 根据Apache Camel文档,如果您使用的是cron表达式,则不能使用trigger.XXX选项(允许配置失火指令)。
  • 根据Apache Camel文档,只有在石英处于群集模式时才会记录失火。
  • 您可以配置quartz属性以禁用群集模式(我不需要它)。

我没有运气的尝试:

  • 使用org.quartz.jobStore.isClustered:false创建了一个quartz属性文件。 我不确定它是否被拾取(将它放在src / resources中并创建一个指向它的bean)。它没有解决问题。
  • 试图将misfireInstruction设置为路由中的触发选项quartz2:// TestCron?trigger.misfireInstruction = 2&amp; cron = 0/1 * * * *?&#34;

我完全没有选择:x 非常感谢任何帮助:)

1 个答案:

答案 0 :(得分:0)

我无法找到修改失火指令的方法,但我找到了解决方法。

我没有使用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();
        }
    }

}