gpt4 book ai didi

java - Quartz 调度程序和作业 'firing' 早一秒

转载 作者:行者123 更新时间:2023-11-30 11:49:22 26 4
gpt4 key购买 nike

谁能给个建议?我有一份工作每小时运行一次,并且由 Quartz 1.8.3 在 Java webapp 中控制。

但我看到的是,Quartz 有时似乎会提前一秒开始工作。但由于没有明显的模式,因此很难纠正。

我的代码是:

Scheduler_Job sj = Scheduler_Job_DB.get(1);       
sj.setJobRunning(Valid.TRUE);
Scheduler_Job_DB.update(sj);
SQLDateTime currPollDateTime = SQLDateTime.getSQLDateTimeNow();

currDateTimeNow 被设置为 17:59:59 而它应该是 18:00:00。

Quartz 作业的 cron 触发器是 0 0 * * * ?

方法 SQLDateTime.getSQLDateTimeNow();只需获取以毫秒为单位的当前计数并将其转换为 java.sql.Date 和 java.sql.time 元素,如下所示:

public static SQLDateTime getSQLDateTimeNow() {
long milliSecs = DateTime_Utils.getTimeInMilliseconds();
Date date = new Date(milliSecs);
Time time = new Time(milliSecs);
SQLDateTime sqldt = new SQLDateTime(Date.valueOf(date.toString()), Time.valueOf(time.toString()));
return sqldt;
}

类 SQLDateTime 简单地有两个变量如下:

private Date sqlDate;
private Time sqlTime;

并且在使用以 yyyy-mm-dd HH:mm:ss 格式存储在数据库中的日期和时间时很方便。

在 99.9% 的情况下这很好,但我不明白为什么作业似乎提前一秒触发?

我应该补充一点,升级到 Quartz 2.x 不是一个选项。

有什么想法吗?

我的解决方案是保持简单。因此,如果 Quartz 作业在给定时间触发,并且如果我将作业的详细信息存储在数据库表中,那么我还可以存储当前运行时间和日期,例如YYYY-MM-DD 18:00:00。

因此作业启动,它从数据库中读取包括日期和时间在内的详细信息,并进行 18:00:00 的所有更新。

然后在作业结束时,当前运行时间和日期增加一个小时,并写回数据库以用作下一次运行日期和时间。因此,18:00:00 变为 19:00:00,并且日期保持不变,除非作业在 23:00:00 运行。

所以一切都是同步的,没有毫秒。

无论如何理论上听起来不错......

最佳答案

可能是不同的时钟略有偏移,所以当 quartz 调度程序在 18:00:00 005 启动时,数据库可能仍然认为它是 17:59: 59980.

如果这对您来说确实是个问题,您可能希望让线程 hibernate 数百毫秒,以便它始终正确。

关于java - Quartz 调度程序和作业 'firing' 早一秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8420106/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com