如何获取 Quartz 作业每日周期的最后预定触发时间?

问题描述 投票:0回答:1

我正在使用 Quartz (v2.3.2) 在 Spring Boot 应用程序中调度进程,并且我需要帮助来确定当前每日周期的确切结束时间。设置如下:

该作业计划从晚上 7:00 到第二天凌晨 2:59 每 5 分钟运行一次。我想检索此周期的结束时间,特别是相应日期的凌晨 2:59,这样我就可以在下一个周期于晚上 7:00 开始之前识别出此周期何时结束。

我熟悉 getNextFireTime() 和 getPreviousFireTime() 等方法,但它们似乎没有提供特定每日窗口内的最终触发时间。有没有办法根据这个每日时间表得到当前周期的最后一次点火时间?

任何关于如何使用 Quartz 实现这一目标的见解或建议将不胜感激。谢谢!

我尝试通过分割 cron 表达式字符串来提取结束时间,但后来意识到这不是正确的解决方案。

java cron quartz
1个回答
0
投票

看起来类似的问题
在 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);
© www.soinside.com 2019 - 2024. All rights reserved.