如何为多个时间段设置cron表达式

问题描述

我需要在每天上午 9 点和晚上 10.15 点触发 cron 作业。 即触发器将是:

下个今天 09:00:00
然后今天 22:00:00
然后今天 22:15:00
然后第二天 09:00:00 等等......

我以 * 0,15 9,22 * * * 的身份完成了它,但它也会在上午 9.15 点触发,这是我不想要的。 请帮我创建这个表达式。

如果这是不可能的,任何人都可以建议如何在时间触发的 azure 函数中编写多个 cron 表达式。这是我的代码

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

解决方法

据我所知,你不能在一个函数中创建这样的CRON expression,我可以想到创建两个函数需要什么。一个函数 CRON 表达式:* 0 9,22 * *,另一个 CRON 表达式:* 15 22 * *

,

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,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);
    }
}