Статьи

Кварц 2: Изучение различных типов планирования

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