Мы часто думаем о Кроне, когда хотим наметить работу. Крон очень гибок в выражении повторяющегося вхождения события / задания в очень компактном выражении. Однако это не ответ на все вопросы, так как я часто вижу, что люди просят помощи на форуме пользователей Quartz. Знаете ли вы, что популярная библиотека Quartz 2 предоставляет много других типов расписаний (называемых Trigger) помимо cron? Я покажу вам каждый из встроенных в Quartz 2 типов расписаний в рамках полного, автономного скрипта Groovy, который вы можете запустить и протестировать. Давайте начнем с простого.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
@Grab('org.quartz-scheduler:quartz:2.1.6')@Grab('org.slf4j:slf4j-simple:1.7.1')import org.quartz.*import org.quartz.impl.*import org.quartz.jobs.*import static org.quartz.DateBuilder.*import static org.quartz.JobBuilder.*import static org.quartz.TriggerBuilder.*import static org.quartz.SimpleScheduleBuilder.*def trigger = newTrigger() .withSchedule( simpleSchedule() .withIntervalInSeconds(3) .repeatForever()) .startNow() .build()dates = TriggerUtils.computeFireTimes(trigger, null, 20)dates.each{ println it } |
Это SimpleTrigger ‘s SimpleTrigger , и он позволяет вам создавать повторяющиеся задания с фиксированной скоростью. Вы можете даже ограничить определенное количество, если хотите. Я импортировал все необходимые классы, необходимые для скрипта, и использую последний API-интерфейс Quartz 2.x для создания экземпляра триггера.
Самый быстрый способ изучить и проверить, соответствует ли планирование вашим потребностям, это распечатать его будущее время выполнения. Следовательно, вы видите меня, используя TriggerUtils.computeFireTimes в сценарии. Запустите вышеприведенное, и вы должны получить дату и время по расписанию, в данном случае каждые 3 секунды.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
|
bash> $ groovy simpleTrigger.groovy Tue Oct 23 20:28:01 EDT 2012 Tue Oct 23 20:28:04 EDT 2012 Tue Oct 23 20:28:07 EDT 2012 Tue Oct 23 20:28:10 EDT 2012 Tue Oct 23 20:28:13 EDT 2012 Tue Oct 23 20:28:16 EDT 2012 Tue Oct 23 20:28:19 EDT 2012 Tue Oct 23 20:28:22 EDT 2012 Tue Oct 23 20:28:25 EDT 2012 Tue Oct 23 20:28:28 EDT 2012 Tue Oct 23 20:28:31 EDT 2012 Tue Oct 23 20:28:34 EDT 2012 Tue Oct 23 20:28:37 EDT 2012 Tue Oct 23 20:28:40 EDT 2012 Tue Oct 23 20:28:43 EDT 2012 Tue Oct 23 20:28:46 EDT 2012 Tue Oct 23 20:28:49 EDT 2012 Tue Oct 23 20:28:52 EDT 2012 Tue Oct 23 20:28:55 EDT 2012 Tue Oct 23 20:28:58 EDT 2012 |
Наиболее часто используемый тип планирования — CronTrigger , и вы можете проверить его аналогичным образом.
|
1
|
<code>@Grab('org.quartz-scheduler:quartz:2.1.6') @Grab('org.slf4j:slf4j-simple:1.7.1') import org.quartz.* import org.quartz.impl.* import org.quartz.jobs.* import static org.quartz.DateBuilder.* import static org.quartz.JobBuilder.* import static org.quartz.TriggerBuilder.* import static org.quartz.CronScheduleBuilder.* def trigger = newTrigger() .withSchedule(cronSchedule('0 30 08 * * ?')) .startNow() .build() dates = TriggerUtils.computeFireTimes(trigger, null, 20) dates.each{ println it } </code> |
Javadoc для CronExpression очень хорош, и вы должны обязательно прочитать его полностью, чтобы эффективно его использовать. С помощью этого скрипта вы можете легко изучить все комбинации, которые вам нужны, и проверить время срабатывания до начала работы.
Теперь, если у вас есть какие-то странные потребности в планировании, такие как запуск задания каждые 30 минут с понедельника по пятницу и только с 8:00 до 10:00, не пытайтесь втиснуть все это в выражение Cron. Quartz 2.x имеет выделенный тип триггера как раз для этого использования и называется DailyTimeIntervalTrigger ! Проверь это:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
|
@Grab('org.quartz-scheduler:quartz:2.1.6')@Grab('org.slf4j:slf4j-simple:1.7.1')import org.quartz.*import org.quartz.impl.*import org.quartz.jobs.*import static org.quartz.DateBuilder.*import static org.quartz.JobBuilder.*import static org.quartz.TriggerBuilder.*import static org.quartz.CronScheduleBuilder.*def trigger = newTrigger() .withSchedule(cronSchedule("0 30 08 * * ?")) .startNow() .build()dates = TriggerUtils.computeFireTimes(trigger, null, 20)dates.each{ println it } |
Еще один скрытый тип триггера от Quartz — CalendarIntervalTrigger , и вы можете использовать его, если вам нужно повторять задание, которое находится в каждом интервале календарного периода, например, каждый год или месяц и т. Д., Где интервал не является фиксированным, а зависит от календаря. Вот тестовый скрипт для этого.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
@Grab('org.quartz-scheduler:quartz:2.1.6')@Grab('org.slf4j:slf4j-simple:1.7.1')import org.quartz.*import org.quartz.impl.*import org.quartz.jobs.*import static org.quartz.DateBuilder.*import static org.quartz.JobBuilder.*import static org.quartz.TriggerBuilder.*import static org.quartz.CalendarIntervalScheduleBuilder.*import static java.util.Calendar.*def trigger = newTrigger() .withSchedule( calendarIntervalSchedule() .withInterval(2, IntervalUnit.MONTH)) .startAt(futureDate(10, IntervalUnit.MINUTE)) .build()dates = TriggerUtils.computeFireTimes(trigger, null, 20)dates.each{ println it } |
Я надеюсь, что это поможет вам приступить к выполнению большинства ваших задач по планированию с Quartz 2. Опробуйте их и узнайте ваши будущие времена запуска, прежде чем даже планирование работы в планировщике должно сэкономить вам время и проблемы.
Ссылка: Изучение различных типов расписаний с помощью Quartz 2 от нашего партнера по JCG Земьяна Дена в блоге A Programmer’s Journal .