任何人都可以提供建议吗?我有一个小时,每小时运行的工作,由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运行,否则日期保持不变。
所以一切都是同步的,没有玩毫秒。
无论如何,这在理论上听起来不错......
答案 0 :(得分:1)
可能是不同的时钟略微偏移,所以当石英调度程序在 18:00:00 005 启动时,可能是数据库仍然认为其 17:59: 59 980 。
如果它对你来说真的是一个问题,你可能想要让线程睡几百毫米,这样它总是正确的。