2013-09-19 2 views
-1

Предположим, у меня есть выражение Cron как 0 0 12 1/1 *? * По некоторым причинам сервер был остановлен между 11:50 и 12:05 и снова начал работу после 12:05 по этому сценарию, как я могу запустить пропущенное запланированное выражение Cron после запуска сервера? Есть ли у кварца какое-либо решение для решения вышеуказанной проблемы.Об увольнении пропущенных запланированных выражений Cron в кварце?

ответ

0

См. Кварцевую документацию tutorials или this отличная статья для «Инструкции о пропущенных пропусках», которые являются политиками, используемыми в триггерах кварца для восстановления пропущенных заданий.

Если вы хотите терпеть выключение/сбой сервера, вам необходимо настроить Qaurtz на использование постоянного хранилища заданий, чтобы он как JDBCJobStore «дождался» последнего выполнения задания до сбоя.

Обновление: См this answer, что объяснить, как создать извлекаемых рабочих мест.

+0

: Спасибо за ваш ответ. Мы используем кварц-1.8.6, когда я использую код ниже. Я думаю, что некоторые классы не находятся в банке. мне нужно обновить новую версию кварца? trigger = newTrigger() .withIdentity ("trigger3", "group1") .withSchedule (cronSchedule ("0 0/2 8-17 * *?")) .forJob ("myJob", "group1") .build(); ваша помощь будет оценена по достоинству. – Loganathan

+0

Редактировать свой вопрос и добавить код и информацию, чтобы я мог помочь вам лучше :) – zerologiko

0

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

Решение, которое я нашел, состоит в том, чтобы вернуться к одному временному интервалу для триггера и рассчитать то, что было бы следующим временем стрельбы. Итерированием всех триггеров может быть определено самое последнее время, которое должен был запустить триггер в прошлом.


Вычислить интервал между каждыми топками:

Date nextFireTime = trigger.getNextFireTime(); 
Date subsequentFireTime = trigger.getFireTimeAfter(nextFireTime); 
long interval = subsequentFireTime.getTime() - nextFireTime.getTime(); 

не найти следующий раз огневого за один раз, пока интервал в прошлом:

Date previousPeriodTime = new Date(System.currentTimeMillis() - interval); 
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime); 

Я обнаружил, что если вы используете a CronTrigger это мешает вам просить время огня в прошлом. Чтобы обойти эту проблему, я изменить время начала, так что выше фрагмент кода становится:

Date originalStartTime = trigger.getStartTime(); // save the start time 
Date previousPeriodTime = new Date(originalStartTime.getTime() - interval); 
trigger.setStartTime(previousPeriodTime); 
Date previousFireTime = trigger.getFireTimeAfter(previousPeriodTime); 
trigger.setStartTime(originalStartTime); // reset the start time to be nice 

перебирать все триггеры и найти тот, который совсем недавно в прошлом:

for (String groupName : scheduler.getTriggerGroupNames()) { 
    for (String triggerName : scheduler.getTriggerNames(groupName)) { 
     Trigger trigger = scheduler.getTrigger(triggerName, groupName); 
     // code as detailed above... 
     interval = ... 
     previousFireTime = ... 
    } 
} 

Этот код могут быть реорганизованы в вспомогательные методы или классы. Я фактически использую вышеуказанный алгоритм в подклассе делегирования триггера, который затем помещаю в набор, отсортированный по предыдущим временам срабатывания.

Смежные вопросы