Запуск повторяющихся запланированных событий

Запланировать автоматизацию заранее можно с помощью трех разных условий:

  1. Time.ScheduledTimeEvent
  2. Time.RecurringClockTimeScheduledEvent
  3. Time.RecurringSolarTimeScheduledEvent

Первый, Time.ScheduledTimeEvent, позволяет запланировать запуск автоматизации в определенный момент в будущем или на регулярной основе в зависимости от времени или солнечного события (рассвета или заката).

Например, это условие запускает автоматизацию каждый день в 22:00:

starter<_>(structure, Time.ScheduledTimeEvent) {
  parameter(Time.ScheduledTimeEvent.clockTime(LocalTime.of(22, 0, 0, 0)))
}

Вместо времени на часах можно указать событие солнечного времени. Параметр для этого типа триггера – SolarTimeStruct, состоящий из следующих элементов:

  1. type, которое может быть SolarTimeType.Sunrise или SolarTimeType.Sunset.
  2. offset, которое позволяет сдвинуть время начала относительно солнечного события на любое количество времени. Положительные значения задают задержку после события, а отрицательные – до него.

В примере ниже автоматизация запускается каждый день за 15 минут до рассвета:

starter<_>(structure, Time.ScheduledTimeEvent) {
  parameter(
    Time.ScheduledTimeEvent.solarTime(
      SolarTimeStruct(SolarTimeType.Sunrise, java.time.Duration.ofMinutes(-15))
    )
  )
}

Два других – это триггеры повторяющихся запланированных событий. Они позволяют создавать автоматизации, которые запускаются периодически в соответствии с более конкретными критериями, включая условия, основанные на времени и календаре.

Time.RecurringClockTimeScheduledEvent позволяет запланировать автоматизацию на основе одного или нескольких условий, связанных со временем или датой. В этом стартовом событии используется синтаксис, похожий на синтаксис утилиты cron в Unix, чтобы задать расписание для повторяющейся автоматизации.

Time.RecurringSolarTimeScheduledEvent позволяет запланировать автоматизацию на основе времени восхода или заката, при необходимости в сочетании с условием на основе календаря.

cron выражение

Возможно, вы уже знакомы с cron – командой, которая используется в системах Unix и Linux для планирования повторяющихся заданий.

В повторяющихся запланированных событиях используется синтаксис выражений, похожий на тот, который применяется в cron. По этой причине выражения, используемые с такими стартерами, называются выражениями cron.

Существует несколько разновидностей cron и несколько вариантов синтаксиса. Выражения для повторяющихся запланированных событий cron используют тот же синтаксис, что и планировщик Quartz. Синтаксис выражений Quartz cron описан в документации по CronExpression Quartz.

Примеры

Вот несколько примеров.

Пример использования секунда минута Час День месяца Месяц День недели Год
Запускать каждые 24 часа в полночь 0 0 0 ? * * *
Запускать каждый вторник в 6:00 0 30 19 ? * 3 *
Выполнять в 15 минут каждого часа в течение февраля. 0 15 * ? 2 * *
Выполнять раз в час 0 0 * ? * * *
Выполнять каждые 24 часа в полночь с января по март в ближайший к первому числу месяца будний день. 0 0 0 ? 1-3 1W *
Во второй четверг февраля, раз в час, в 15 минут 0 15 * ? 2 5#2 *
Выполнять в 15 минут каждого часа в последний день февраля. 0 15 * L 2 ? *
Запускать в 06:00 по вторникам и четвергам. 0 30 19 ? * 3,5 *

RecurringClockTimeScheduledEvent

В условии запуска RecurringClockTimeScheduledEvent строка выражения cron назначается полю Time.RecurringClockTimeScheduledEvent.cronExpression.

Ниже приведен пример условия RecurringClockTimeScheduledEvent, которое запускает автоматизацию в 20:00 каждую среду апреля.

starter<_>(structure, event = Time.RecurringClockTimeScheduledEvent) {
  parameter(Time.RecurringClockTimeScheduledEvent.cronExpression("0 0 20 ? 4 4 *"))
}

RecurringSolarTimeScheduleEvent

Стартер RecurringSolarTimeScheduleEvent принимает два параметра:

  1. SolarTimeStruct.
  2. cronExpression – подмножество выражения cron, состоящее только из полей "День месяца", "Месяц", "День недели" и "Год". Солнечное время определяет точное время запуска автоматизации, поэтому поля Second, Minute и Hour опускаются.

В примере ниже показано условие, которое запускает автоматизацию через час после восхода солнца по средам в апреле.

starter<_>(structure, event = Time.RecurringSolarTimeScheduledEvent) {
  parameter(
    Time.RecurringSolarTimeScheduledEvent.solarTime(
      TimeTrait.SolarTimeStruct(SolarTimeType.Sunrise, Duration.ofHours(1))
    )
  )
  parameter(Time.RecurringSolarTimeScheduledEvent.cronExpression("? 4 4 *"))
}