[英]Quartz scheduler and job 'firing' a second early
有人可以建议吗? 我有一个每小时运行一次的工作,该工作由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%的情况下,这很好,但我不明白为什么工作似乎提前一秒钟解雇了?
我应该补充一点,不是升级到Quartz2.x。
有任何想法吗?
我的解决方案是保持简单。 因此,如果Quartz作业在给定的时间触发,并且如果我的作业详细信息存储在数据库表中,那么我还可以存储当前的运行时间和日期,例如YYYY-MM-DD 18:00:00。
因此该作业被触发,它从数据库中读取包括日期和时间在内的详细信息,并进行18:00:00的所有更新。
然后,在作业结束时,当前运行时间和日期将增加一个小时,然后被写回到数据库中,以用作下一个运行日期和时间。 因此18:00:00变为19:00:00,并且日期保持不变,除非作业在23:00:00运行。
因此,一切都同步进行,没有毫秒可玩。
从理论上来说听起来不错...
可能是不同的时钟略有偏移,因此,当石英调度程序在18:00:00 005开始时,数据库可能仍然认为其17:59:59 980 。
如果确实对您有问题,您可能要使线程休眠几百毫秒,因此它总是正确的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.