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

How to set cron expression for multiple time periods

我有一个要求在每天上午 9 点和晚上 10 点 15 分触发 cron 作业。 即触发器将是:

next today at 09:00:00
then today at 22:00:00
then today at 22:15:00
then next day at 09:00:00 and so on...

我已经按照 * 0,15 9,22 * * * 完成了它,但它也会在上午 9 点 15 分触发,我不希望这样。 请帮我创建这个表达式。

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

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

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

据我所知,您无法创建每个触发器之间具有不同距离的 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);
    }
}