Java 如何在失败时重新调度Apache Camel Quartz(CronScheduledOutPolicy)端点路由

Java 如何在失败时重新调度Apache Camel Quartz(CronScheduledOutPolicy)端点路由,java,spring,maven,apache-camel,quartz-scheduler,Java,Spring,Maven,Apache Camel,Quartz Scheduler,这是我的数据处理计划(cronscheduledrutepolicy) <route> <from uri="quartz://schedule?cron=0+1+0+*+*+?+*"/> <bean ref="processData" method="scheduleData" /> <convertBodyTo type="java.util.List" />

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

    <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>

java.lang.Exception
它每天早上12点01分运行,问题是如果出现任何错误,如何使用计划id或路线id手动重新运行或重新计划

谢谢。

如果遇到异常,您可以使用重新尝试exchange 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>

java.lang.Exception
如果遇到异常,可以使用重新尝试exchange 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>

java.lang.Exception

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

我建议您将其分为3条路径(这显然是JavaDSL,但您可以轻松地将其转换为xml)

  • 第一个路由是quartz调度-它调用处理路由

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

    from("direct:doProcessing")
        // do awesome stuff here...
    ;
    
  • 第三种方法是手动重启

    from("timer://manualRestart?repeatCount=1")
        .routeId("manualRestart")
        .noAutoStartup()
        .to("direct:doProcessing")
    ;
    
  • 现在,您可以使用命令行上的
    route start
    命令,或通过类似
    fmc
    的工具,使用id“manualRestart”启动路由


    希望这能有所帮助。

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

    我建议您将其分为3条路径(这显然是JavaDSL,但您可以轻松地将其转换为xml)

  • 第一个路由是quartz调度-它调用处理路由

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

    from("direct:doProcessing")
        // do awesome stuff here...
    ;
    
  • 第三种方法是手动重启

    from("timer://manualRestart?repeatCount=1")
        .routeId("manualRestart")
        .noAutoStartup()
        .to("direct:doProcessing")
    ;
    
  • 现在,您可以使用命令行上的
    route start
    命令,或通过类似
    fmc
    的工具,使用id“manualRestart”启动路由


    希望这有帮助。

    谢谢您的回答。我需要一个运行计划手动根据调度程序名称或路线id通过一个用户界面。有可能是因为…@Sureshkumarpannerselvan我不知道一种简单的开箱即用的方法。您可以将失败的交换转发到死信队列,编写客户端向您显示它们,请求您的输入,然后通过MQ向您的组件发送“命令”消息,然后根据命令消息触发路由。是的,我们可以做到。谢谢,谢谢你的回答。我需要一个运行计划手动根据调度程序名称或路线id通过一个用户界面。有可能是因为…@Sureshkumarpannerselvan我不知道一种简单的开箱即用的方法。您可以将失败的exchange转发到死信队列,编写客户端向您显示,请求输入,然后通过MQ发送“命令”消息到组件,然后根据命令消息触发路由。我们可以这样做。谢谢。你能澄清这个问题吗?如果路由失败,你是想手动重新运行路由吗?是的,我需要手动执行。因为我使用多个数据源,并且对于某些计划程序,输入是基于时间的。请澄清问题-如果路由失败,您是否希望能够手动重新运行路由?是的,我需要手动执行。因为我使用多个数据源,并且对于某些调度器,输入是基于时间的。