如果应用程序停止,quartz 调度程序获取下一个调度程序时间

Posted

技术标签:

【中文标题】如果应用程序停止,quartz 调度程序获取下一个调度程序时间【英文标题】:quartz scheduler get next scheduler time if the application stopped 【发布时间】:2017-09-05 07:17:01 【问题描述】:

目前我在我的应用程序中使用石英调度程序来执行调度程序。我的应用程序在 tomcat 服务器上运行。如果服务器已启动,则调度程序将根据提供的开始时间开始触发任务。

我的问题是,如果任务被安排为每 10 分钟间隔执行一次,并且 tomcat 由于某些原因被停止并在两天后恢复,那么用于获取下一个有效时间的石英调度程序表达式基于在提供的开始时间,因此调度程序作业是回溯作业..

实时示例:

使用下面的 cron 表达式将任务设置为每 10 分钟间隔一次。

0 0/10 * 1/1 * ? *

作业的开始时间是

“2017-04-08 21:46:00”

但应用程序/tomcat 服务器仅在 4 月 10 日启动,在执行调度程序后,启动时间更改为以下格式

“2017-04-08 21:56:00”

只是时间增加到 10 分钟,日期没有更改为 4 月 10 日(今天)。

目前我正在使用下面的代码来获取调度程序的下一个日期/时间

    CronExpression exp = new CronExpression(schedulerConfig.getCronexpression());

  NextschedulerDate = exp.getNextValidTimeAfter(Currentstartdate);

同样的情况不适用于工作日选项。请帮忙

【问题讨论】:

您在 CronTrigger 上的失火指令是什么?如果您使用 MISFIRE_INSTRUCTION_FIRE_ONCE_NOW,您可以尝试使用 MISFIRE_INSTRUCTION_DO_NOTHING。 【参考方案1】:

如果Currentstartdate"2017-04-08 21:46:00" 并且CronExpression exp"0 0/10 * 1/1 * ? *",那么NextschedulerDate 当然是"2017-04-08 21:56:00"。这是正确的,因为这是在您提供的日期之后满足 cron 表达式的第一个有效日期

如果您想知道给定 cron 表达式当前日期之后的第一个有效日期,您可以使用NextschedulerDate = exp.getNextValidTimeAfter(new Date());

但是所有的困惑都来自于使用startDate。那是作业计划运行的日期,而不是它实际运行的日期。 您可能的意思是使用getFireTime(用于正在运行的作业)、getNextFireTimegetPreviousFireTime(任何作业)来获取实际的执行日期。

【讨论】:

@KarthickSambanghi 很高兴我能帮助你。如果是这样的话记得采纳答案,谢谢!【参考方案2】:

循环调用getNextValidTimeAfter,直到NextScheduledDate在未来。

【讨论】:

是的,约翰,也这样做了。感谢您的回复。

以上是关于如果应用程序停止,quartz 调度程序获取下一个调度程序时间的主要内容,如果未能解决你的问题,请参考以下文章

net core quartz调度 warp打包 nssm部署到windowsservice

Quartz 调度程序无法获取 JNDI DB 资源但仍然启动

替代轮询作业调度程序

quartz集群调度任务负载不均

org.quartz.SchedulerException:调度程序已在 Magnolia 中关闭

在Quartz调度程序中使用@DisallowConcurrentExecution