Java 石英调度器和作业';发射';第二次提前

Java 石英调度器和作业';发射';第二次提前,java,quartz-scheduler,batch-processing,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 currPollDateT

有人能提供建议吗?我有一个作业,每小时运行一次,由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应设置为18:00:00时设置为17:59:59

石英作业的cron触发器为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;
}
private Date sqlDate;
private Time sqlTime;
类SQLDateTime只有两个变量,如下所示:

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;
}
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:59 980


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

我想知道这一点:但时钟肯定都是从底层Win 7服务器获取日期和时间的吗?这是一个问题,因为各种更新都安排好了,当问题发生时,这些更新都会被错过。我不相信在任何时候都是100%正确的。也可能是一部分使用毫秒,另一部分使用纳米,所以当时间为'17:59:59 9991'时,石英说:好的,1800,但数据库不同意。你为什么不使用java日期,这样所有东西都使用相同的时间呢?我想你可能认为这两个时钟可能有点不同步是对的。我使用JavaSQLDateTime类是因为它很方便,并且在手头的应用程序中工作得很好。但是,如果时间不是小时,则将线程延迟一秒钟可能是一个答案。我将把这篇文章发布到Quartz,看看他们的想法。或者简单地将时间转换为字符串,并重新格式化分钟和秒(如果不是00)。