0

我正在使用带有 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 秒钟然后重新开始。

它不是继续它离开计数的地方,而是赶上路线停止时它没有做的每一次迭代。

我读了很多书试图解决这个问题。我学到的是以下内容:

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

我没有运气的尝试:

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

我完全没有选择:x 将不胜感激任何帮助 :)

4

1 回答 1

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();
        }
    }

}
于 2018-05-23T09:32:47.170 回答