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

Вы можете запланировать автоматизацию заранее, используя три разных события:

  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 позволяет запланировать автоматизацию на основе одного или нескольких условий времени или даты. В этом стартере используется синтаксис, похожий на тот, который применяется в утилите Unix cron для указания расписания повторяющихся автоматизированных задач.

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

Выражения cron

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

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

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

Примеры

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

Пример использования секунда минута Час День месяца Месяц День недели Год
Запускать каждые 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 ? *
Запускать в 6: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, состоящее только из полей "День месяца", "Месяц", "День недели" и "Год". Солнечное время определяет точное время запуска автоматизации, поэтому поля "Секунда", "Минута" и "Час" опущены.

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

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