我正在使用 Quartz (v2.3.2) 在 Spring Boot 应用程序中调度进程,并且我需要帮助来确定当前每日周期的确切结束时间。设置如下:
该作业计划从晚上 7:00 到第二天凌晨 2:59 每 5 分钟运行一次。我想检索此周期的结束时间,特别是相应日期的凌晨 2:59,这样我就可以在下一个周期于晚上 7:00 开始之前识别出此周期何时结束。
我熟悉 getNextFireTime() 和 getPreviousFireTime() 等方法,但它们似乎没有提供特定每日窗口内的最终触发时间。有没有办法根据这个每日时间表得到当前周期的最后一次点火时间?
任何关于如何使用 Quartz 实现这一目标的见解或建议将不胜感激。谢谢!
我尝试通过分割 cron 表达式字符串来提取结束时间,但后来意识到这不是正确的解决方案。
看起来类似的问题
在 Java 中使用 Cron 表达式查找上次触发时间
参考https://www.quartz-scheduler.net/documentation/quartz-4.x/tutorial/more-about-triggers.html
我们能做的最好的事情就是获取触发器 并基于以下事实:“该作业计划从晚上 7:00 到第二天凌晨 2:59 每 5 分钟运行一次。我想检索此周期的结束时间,特别是相应日期的凌晨 2:59 ,这样我就可以在下一个周期于晚上 7:00 开始之前识别出此周期何时结束。” 并使用 getFireTimeAfter 循环查找此范围内的最后一次触发时间。
检查以下内容是否适合您。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start();
TriggerKey triggerKey = new TriggerKey("yourTriggerName", "yourTriggerGroup");
Trigger trigger = scheduler.getTrigger(triggerKey);
// Define the start and end time for today
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
String todayStr = dateFormat.format(new Date());
Date startOfCycle = dateFormat.parse(todayStr + " 19:00:00");
Date endOfCycle = dateFormat.parse(todayStr + " 02:59:00");
// If the endOfCycle is before the startOfCycle, it means it's on the next day
if (endOfCycle.before(startOfCycle)) {
endOfCycle = new Date(endOfCycle.getTime() + 24 * 60 * 60 * 1000);
}
Date nextFireTime = trigger.getFireTimeAfter(startOfCycle);
Date lastFireTime = null;
while (nextFireTime != null && nextFireTime.before(endOfCycle)) {
lastFireTime = nextFireTime;
nextFireTime = trigger.getFireTimeAfter(nextFireTime);
}
System.out.println("Last fire time in the current cycle: " + lastFireTime);