Quartz调度程序和工作'解雇'第二个早

时间:2011-12-07 17:54:38

标签: java quartz-scheduler batch-processing

任何人都可以提供建议吗?我有一个小时,每小时运行的工作,由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运行,否则日期保持不变。

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

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

1 个答案:

答案 0 :(得分:1)

可能是不同的时钟略微偏移,所以当石英调度程序在 18:00:00 005 启动时,可能是数据库仍然认为其 17:59: 59 980

如果它对你来说真的是一个问题,你可能想要让线程睡几百毫米,这样它总是正确的。