Как задать выражение cron для нескольких периодов времени

#azure #cron #azure-functions #cron-task #crontrigger

Вопрос:

У меня есть требование запускать задание cron каждый день в 9 утра и 10.15 вечера. то есть триггер будет таким:

далее сегодня в 09:00:00
, затем сегодня в 22:00:00
, затем сегодня в 22:15:00
, затем на следующий день в 09:00:00 и так далее…

Я сделал это как * 0,15 9,22 * * * , но это также сработает в 9.15 утра, чего я не хочу. Пожалуйста, помогите мне с созданием этого выражения.

Если это невозможно, может ли кто-нибудь, пожалуйста, подсказать, как написать несколько выражений cron в функции azure, запускаемой вовремя. Вот мой код:

 [FunctionName("Function1")]
public void Run([TimerTrigger("* 0,15 9,22 * * *")] TimerInfo myTimer, ILogger log)
 {
  //my code here
 }
 

Комментарии:

1. Примечание. перед фактической командой в записи crontab должно быть только пять полей .

Ответ №1:

Насколько я знаю, вы не можете создать такое CRON expression в функции, я могу придумать, что вам нужно для создания двух функций. Выражение CRON функции: * 0 9,22 * * , другое выражение CRON: * 15 22 * * .

Ответ №2:

AFAIK вы не можете создавать выражения cron с разным расстоянием между каждым триггером.

Вы можете решить свою проблему несколькими способами программно:


  • Создайте одно выражение cron, представляющее наибольший общий знаменатель. Например.
    • в вашем примере это займет 15 минут
    • таким образом, выражение было бы 0 0/15 0 ? * * *
  • Сделайте функцию достаточно разумной, чтобы решить, следует ли ей пропускать или выполнять триггер. Например, глупый подход был бы:
 public class CronFunction {
    private void processEvent(String event) {
        // process...
    }

    @FunctionName("cron")
    public void cronFunc(
        @TimerTrigger(schedule = "0 0 0/1 ? * SAT,SUN *") String event, ExecutionContext context) {
        curr_day = ...;
        curr_time = ...;
        if ((curr_day == today and curr_time in ['09:00:00', '22:00:00', '22:15:00']) ||
           (curr_day == tomorrow and curr_time in ['09:00:00'])) {
                processEvent(event);
        } else {
            logger.debug("skipping trigger");
        }
    }

}
 

Создайте несколько триггеров, вызывающих одну и ту же реализацию.

 public class CronFunctions {
    private void processEvent(String event) {
        // process...
    }

    @FunctionName("cron1")
    public void cronFunc1(
        @TimerTrigger(schedule = "0 0 0/1 ? * SAT,SUN *") String event, ExecutionContext context) {
        processEvent(event);
    }

    @FunctionName("cron2")
    public void cronFunc2(
        @TimerTrigger(schedule = "0 0/15 0 ? * MON,TUE,WED,THU,FRI *") String event,
        ExecutionContext context) {
        processEvent(event);
    }
}