Как смоделировать вхождений »или« Количество повторов »с помощью CronTriggers в Java? - PullRequest
4 голосов
/ 01 января 2012

Я использую Кварцевый Планировщик (версия 1.8.3 из-за ограничений проекта), и мне поручили задачу создания «MS Outlook-подобного» планировщика для заданий, специфичных для моего проекта.Кажется, все нормально работает, но у меня действительно огромная проблема с CronTriggers (эта проблема также существует в версии 2.1 Quartz):

Я использую CronTriggers для шаблонов повторения DAILY, WEEKLY и MONTHLY.В дополнение к шаблону повторения, я также предоставляю опцию для «Нет.событий ».Это стало проклятием моей жизни!CronTrigger не предоставляет опцию 'repeatCount', как это делают SimpleTriggers (ошибка: https://jira.terracotta.org/jira/browse/QTZ-242?page=com.atlassian.jira.plugin.system.issuetabpanels%3Achangehistory-tabpanel). Видимо, это может быть исправлено в версии 2.2, но я не могу ждать так долго и не считаю, что моя проблема уникальна!

Несколько вариантов, которые я посчитал заслуживающими изучения:

  1. Рассчитать 'EndTime' для CronTrigger, но используя мою собственную логику - это не в состоянии охватить все возможные случаи и является в лучшем случае приблизительнымдаже для простых случаев.

  2. Используйте TriggerListener или JobListener, чтобы отслеживать количество итераций задания, так как мне просто нужно остановить работу после N итераций, и у меня естьОтображение 1: 1 из экземпляра Job в Trigger. Это кажется нереальным и / или эффективным из-за большого воображения.

Может ли кто-нибудь из вас, кто использовал CronTriggers с опцией«Количество случаев», пожалуйста, дайте некоторое представление о том, как решить эту головоломку?

Ответы [ 2 ]

3 голосов
/ 12 октября 2014

Кажется, что Quartz реализовал что-то, что может помочь: TriggerUtils.computeEndTimeToAllowParticularNumberOfFirings .

Я еще не проверял это, но это код, который я написал на данный момент:

CronTrigger trigger = newTrigger()
    .withSchedule(cronSchedule(cronExpression))
    .build();
Date endDate = TriggerUtils.computeEndTimeToAllowParticularNumberOfFirings((OperableTrigger) trigger,
              new BaseCalendar(Calendar.getInstance().getTimeZone()), 10);
trigger = trigger.getTriggerBuilder().endAt(endDate).build();

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

В любом случае версия 2.2 не имеет этой функции.

Обновление

Я протестировал ее, и она работает.

0 голосов
/ 13 января 2012

Почему бы вам не использовать простой триггер? У вас будут дополнительные расчеты временного интервала во время планирования задания, но это будет одноразовое действие.

...