【问题标题】:How to reschedule Apache Camel Quartz (CronScheduledRoutePolicy) endpoint route on failure如何在失败时重新安排 Apache Camel Quartz (CronScheduledRoutePolicy) 端点路由
【发布时间】:2014-01-02 05:36:57
【问题描述】:

这是我的数据处理计划(CronScheduledRoutePolicy)。

    <route>
        <from uri="quartz://schedule?cron=0+1+0+*+*+?+*"/>
        <bean ref="processData" method="scheduleData" />
            <convertBodyTo type="java.util.List" />
            <to uri="activemq:queue:DATA.GENERATEDLIST?mapJmsMessage=false" />

        <onException>
            <exception>java.lang.Exception</exception>
            <to uri="activemq:queue:DATA.ERROR.MESSAGES?mapJmsMessage=false&amp;jmsMessageType=Text" />
        </onException>
    </route>

它每天上午 12.01 运行,问题是如果发生任何错误,如何使用调度 ID 或路由 ID 手动重新运行或重新调度。

谢谢。

【问题讨论】:

  • 您能否澄清一下问题 - 如果路由失败,您是否希望能够手动重新运行路由?
  • 是的,我需要手动操作。因为我正在使用多个数据源,并且对于某些调度程序输入是基于时间的。

标签: java spring maven apache-camel quartz-scheduler


【解决方案1】:

好的,既然你已经澄清了你的问题,你需要两种方法来进行数据处理:首先通过 cron 计划,然后手动。

我建议你把它分成 3 个路由(这显然是 java DSL,但你可以很容易地将它转换为 xml)。

  1. 第一条路线是石英调度——它调用处理路线。

    from("quartz://schedule?cron=0+1+0+*+*+?+*")
        .to("direct:doProcessing")
    ;
    
  2. 第二条路线进行处理

    from("direct:doProcessing")
        // do awesome stuff here...
    ;
    
  3. 第三条路是手动重启

    from("timer://manualRestart?repeatCount=1")
        .routeId("manualRestart")
        .noAutoStartup()
        .to("direct:doProcessing")
    ;
    

现在,您可以在命令行上使用route-start 命令或通过fmc 之类的工具启动ID 为“manualRestart”的路由。

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    如果遇到异常,您可以使用re-delivery policy 重试交换 N 次。

    <route>
        <!-- ... -->
        <onException>
            <exception>java.lang.Exception</exception>
            <redeliveryPolicy redeliveryDelay="100000" maximumRedeliveries="3"/>
            <to uri="activemq:queue:DATA.ERROR.MESSAGES?mapJmsMessage=false&amp;jmsMessageType=Text" />
        </onException>
    </route>
    

    【讨论】:

    • 感谢您的回答。我需要根据调度程序名称或通过 UI 的路由 ID 手动运行调度。有可能是因为...
    • @SureshkumarPanneerselvan 我不知道有一种简单的开箱即用的方法。您可以将失败的交换转发到死信队列,编写一个客户端向您展示它们,询问您的输入,然后通过 MQ 向您的组件发送“命令”消息,然后根据命令消息触发您的路由。
    • 是的,我们可以做到。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-17
    • 2016-09-29
    • 1970-01-01
    • 2023-03-10
    • 2011-12-05
    相关资源
    最近更新 更多