假设我有一个这样配置的触发器:
<bean id="updateInsBBTrigger"
class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="updateInsBBJobDetail"/>
<!-- run every morning at 5 AM -->
<property name="cronExpression" value="0 0 5 * * ?"/>
</bean>
触发器必须与另一个应用程序连接,如果有任何问题(如连接失败),它应该重试任务最多五次,每10分钟或直到成功。有任何方法可以配置触发器这样工作吗?
4条答案
按热度按时间yvfmudvl1#
我推荐这样一个实现来在失败后恢复作业:
为什么
1.它不会阻止Quartz Workers
1.它将避免背压。使用setRefireImmediately,作业将立即被触发,这可能会导致背压问题
eivgtgni2#
来源:Automatically Retry Failed Jobs in Quartz
如果你想让一个作业不断尝试直到成功,你所要做的就是抛出一个JobExecutionException,并带有一个标志,告诉调度程序在失败时再次触发它。下面的代码展示了如何操作:
如果你想重试一定次数,它会变得有点复杂。你必须使用StatefulJob并在其JobDataMap中持有一个retryCounter,如果作业失败,你会增加它。如果计数器超过最大重试次数,那么你可以禁用作业。
ctehm74n3#
我建议更灵活和可配置性,以更好地在您的DB中存储两个偏移量:repeatOffset 将告诉你多久后应该重试作业,trialPeriodOffset 将保留作业被允许重新调度的时间窗口的信息。然后你可以检索这两个参数(我假设你使用的是Spring):
然后,作业不需要记住计数器,而是需要记住initalAttempt:
并执行类似以下检查的操作:
最好为返回到应用程序核心工作流的尝试结果创建一个枚举,如上所述。
然后构造重新计划时间:
zqry0prt4#
我希望这些信息对你有用(这是我在这个thread中的回答的副本)
下面是一个启动cron作业的多示例Sping Boot 应用程序的示例。
作业只能在其中一个示例上运行。
每个示例的配置必须相同。
如果作业崩溃,则应尝试重新启动3次,延迟5分钟 * 重新启动尝试次数。
如果作业在3次重启后仍然崩溃,则应该设置作业触发器的默认cron。
我们将在集群模式下使用Quartz:
Deps:
首先,使用answer中提到的Thread.sleep(600000)是一个坏主意。
以下是Quartz配置(更多信息here):
将侦听器添加到调度程序:
现在最重要的-处理我们的工作与监听器的执行逻辑:
最后但并非最不重要:application.yaml
Here数据库官方脚本(使用liquibase或flyway)
更多信息:
About quartz
spring boot using quartz in cluster mode
One more article
Cluster effectively quartz