繁体   English   中英

Quartz Scheduler和作业第二次“点火”

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM