У меня есть требование, когда пользователь может установить дату окончания или может установить определенное количество вхождений перед остановкой любого задания.
Например,
Учтите, что мне нужно отправить смс на определенный номер, и это должно начаться с этого момента, и смс будут отправляться каждые 5 минут.
Теперь, по выбору пользователя, указанное выше задание будет остановлено в определенное время или после n повторений.
И я использую планировщик cron из кварца.
Теперь остановить его в определенное время очень просто, и я сделал это следующим образом:
trigger = TriggerBuilder.newTrigger()
.startAt(startDateObj)
.endAt(endDate)
.withIdentity(uniqueID, "group1")
.withSchedule(
CronScheduleBuilder.cronSchedule(cronString)
)
.build();
Но что делать, если мне нужно остановить его после n повторов? Я знаю, что это можно сделать с помощью простого расписания, например:
simpleSchedule().withRepeatCount(1).withIntervalInSeconds(15)
Но как сделать то же самое для планировщика cron? По некоторым причинам я не могу перейти на другой тип расписания, кроме cron.
Любая помощь будет для меня отличной.
Пожалуйста, дайте мне знать, если требуются дополнительные данные.
Заранее спасибо.
Спасибо, что сохранили счетчик в идее JobDataMap. : D. Раньше думал хранить в БД.




Вы можете подсчитать количество endDate, используя метод computeEndTimeToAllowParticularNumberOfFirings(). (Хотя это имя!).
См. Следующий пример:
CronTrigger trigger = new Trigger()
.withIentity("some_id")
.withSchedule(buildCronScheduler("some_cron_exp"))
.build();
Date endDate = TriggerUtils.computeEndTimeToAllowParticularNumberOfFirings(
(OperableTrigger) trigger,
new BaseCalendar(Calendar.getInstance().getTimeZone()),
repeatCount);
trigger = trigger.getTriggerBuilder().endAt(endDate).build();
К сожалению, прямого способа сделать это нет. Настройка счетчика повторов связана с интерфейсом SimpleTrigger, который не является родительским интерфейсом для CronTrigger. Класс CronTriggerImpl не реализует интерфейс SimpleTrigger. Как вы уже определили, обходной путь будет заключаться в том, чтобы рассчитать дату окончания на основе количества повторений и решить эту проблему таким образом. В качестве альтернативы вы можете отслеживать, сколько раз выполняется задание (возможно, в JobDataMap), а затем попросить задание удалить триггер, когда оно завершит последнее желаемое выполнение.