Как остановить кварцевый планировщик cron после указанного количества вхождений?

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

Например,

Учтите, что мне нужно отправить смс на определенный номер, и это должно начаться с этого момента, и смс будут отправляться каждые 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.

Любая помощь будет для меня отличной.

Пожалуйста, дайте мне знать, если требуются дополнительные данные.

Заранее спасибо.

К сожалению, прямого способа сделать это нет. Настройка счетчика повторов связана с интерфейсом SimpleTrigger, который не является родительским интерфейсом для CronTrigger. Класс CronTriggerImpl не реализует интерфейс SimpleTrigger. Как вы уже определили, обходной путь будет заключаться в том, чтобы рассчитать дату окончания на основе количества повторений и решить эту проблему таким образом. В качестве альтернативы вы можете отслеживать, сколько раз выполняется задание (возможно, в JobDataMap), а затем попросить задание удалить триггер, когда оно завершит последнее желаемое выполнение.

user3745362 12.06.2018 19:21

Спасибо, что сохранили счетчик в идее JobDataMap. : D. Раньше думал хранить в БД.

KOUSIK MANDAL 13.06.2018 05:37
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
2
890
1

Ответы 1

Вы можете подсчитать количество 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();

Другие вопросы по теме