Мы часто думаем о Кроне, когда хотим наметить работу. Крон очень гибок в выражении повторяющегося вхождения события / задания в очень компактном выражении. Однако это не ответ на все вопросы, так как я часто вижу, что люди просят помощи на форуме пользователей 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 .