问题描述
我需要在每天上午 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);
}
}