Кварцевый планировщик и работа «увольнение» второй по раннему - PullRequest
2 голосов
/ 07 декабря 2011

Кто-нибудь может посоветовать?У меня есть работа, которая выполняется каждый час и контролируется в веб-приложении Java с помощью Quartz 1.8.3.

Что я вижу, так это то, что Кварц иногда начинает работать на секунду раньше.Но так как нет очевидной закономерности, это трудно исправить.

Мой код:

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.

Триггер cron для задания Quartz: 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;

И это удобно при использовании даты и времени, хранящихся в базе данных в формате гггг-мм-дд ЧЧ: мм: сс.

В 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 Ответ

1 голос
/ 07 декабря 2011

Может случиться так, что разные часы будут незначительно смещены, поэтому, когда кварцевый планировщик запускается на 18: 00: 00 005 , возможно, база данных по-прежнему считает, что 17: 59: 59 980 .

Если это действительно проблема для вас, вы, возможно, захотите уложить нить в сотню миллисекунд, так что это всегда правильно.

...