我有一个Azure函数,它有一个触发器,使它每15分钟运行一次:
TimerTrigger("0 */15 * * * *", RunOnStartup =false)
在这个功能中,有一些功能我只想每小时运行一次。我目前正在检查当前时间的分钟数,看看它是否应该运行。但据我所知,Azure功能触发器并不总是精确的(这是在基于消费的应用程序服务上运行的(,所以我会检查一段时间。
int currentMinute = DateTime.Now.Minute;
bool extraFunctionality = (currentMinute >= 58 && currentMinute <= 2);
这似乎会奏效;仅在":00";运行,每小时一次。然而,对我来说,它看起来像是糟糕的代码,原因有几个:
- 最早2分钟和最晚2分钟的数字是任意选择的;我不知道在那里使用什么样的时间跨度
- 它依赖于使用DateTime.Now,它将根据服务器设置返回不同的结果,即使我不关心当前分钟以外的任何事情
- 代码读起来根本不像是让它每小时运行一次
在Azure功能中有更好/更合适的方法吗?我可以从TimerInfo参数或ExecutionContext参数中获取关于哪一个15分钟触发器导致函数运行的信息吗?或者,我可以有一个单独的TimerTrigger,每小时运行一次,然后根据两个计时器中的哪一个触发该功能来具有不同的功能?或者有没有办法让TimerTrigger本身传递一个参数,告诉我它在哪个15分钟的窗口中?
或者,我的代码是否正常;也许对我允许它关闭的分钟数进行一些调整?
您可以创建两个Azure函数,一个在15、30、45分钟后运行,另一个在小时内运行。然后,在这些函数中的每一个函数中,如果它在小时内运行,则设置一个变量。
[FunctionName("HourlyFunction")]
public static void RunHourly([TimerTrigger("0 0 15,30,45 * * *")]TimerInfo myTimer, ILogger log)
{
_myService.Run(true);
}
[FunctionName("FifteenMinuteFunction")]
public static void RunEveryFifteen([TimerTrigger("0 0 * * * *")]TimerInfo myTimer, ILogger log)
{
_myService.Run(false);
}
然后有一个单独的服务,可以由这些函数调用:
public class MyService : IMyService
{
public async Task Run(bool isHourlyRun)
{
// Do work here
}
}
*我不确定那些cron表达式是正确的