可配置的计时器触发器 - Azure Web 作业
Configurable Timer Triggers - Azure Web Jobs
我正在构建一个定期触发的作业(比如 1 分钟)。我已经成功地使用了在函数中硬编码时间跨度的触发式 Web 作业。
public void foo([TimerTrigger("00:01:00")] TimerInfo timer)
现在,如果我想将触发时间从 1 分钟更改为 2 分钟,我必须重新部署代码。相反,有一种方法可以从配置文件中使 TimeTrigger 可配置。
请注意,无法使用动态读取的值替换字符串,因为 TimerTrigger 属性是常量字符串表达式或类型。
AFAIK,您需要在代码中为 TimerTrigger
指定 scheduleExpression
参数,或者实施此示例 TimerSamples.cs. For changing the schedule without re-deploy your code, I assume that you could leverage Azure Scheduler to trigger your webjob on some schedule and you could change the schedule settings as you expected without re-deploy your webjob. For more details, you could refer to the section about adding a scheduler job in this tutorial 中描述的 WeeklySchedule
或 DailySchedule
.
经过大量挖掘,我意识到这可以通过 SDK 扩展来完成 class TimerSchedule
。
为此,您需要一个可以用于多个触发器的基础 class。
class CustomTimerTriggerBase: TimerSchedule
{
TimeSpan timer;
public CustomTimerTriggerBase(string triggerConfigKey)
{
timer=TimeSpan.Parse(ConfigurationManager.AppSettings[triggerConfigKey]);
}
public override DateTime GetNextOccurrence(DateTime now)
{
return now.Add(timer);
}
}
使用这个 Base 来生成你的计时器...
public sealed class FooTimer : CustomTimerTriggerBase
{
public FooTimer() : base("FooTimerKey") {}
}
在您的 App.config 中有 "FooTimer"
的密钥
<add key="FooTimerKey" value="00:02:00" />
在您的网络作业函数中使用此 FooTimer class。
public void foo([TimerTrigger(typeof(FooTimer)] TimerInfo timer)
现在您只需更改应用配置中的值即可,无需重新部署代码。
注意:由于您正在使用 Timespan 进行解析,因此字符串可以是您需要的任何格式,如 TimeSpan 格式中所定义。
更新
正如 l--''''''---------'''''''''''' 和 Andy Dobedoe 所指出的
现在(截至 2019 年)实现此目标要简单得多。
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
找到名为 MYCRON 的设置并使用那里的 cron 表达式
事实证明,现在这很容易。只需将应用程序设置作为您的 cron 计划表达式,它就会为您查找。
例如
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
找到名为 MYCRON 的设置并使用那里的 cron 表达式
您可以这样做:
public static void Run([TimerTrigger("%MYSCHEDULE%")] TimerInfo myTimer, ILogger log)
其中 MYSCHEDULE
是一个环境变量,您可以将其存储在 local.settings.json
文件以及门户中的应用程序设置中。
MYSCHEDULE
的示例值为:
"MYSCHEDULE": "0 */2 * * * *"
我正在构建一个定期触发的作业(比如 1 分钟)。我已经成功地使用了在函数中硬编码时间跨度的触发式 Web 作业。
public void foo([TimerTrigger("00:01:00")] TimerInfo timer)
现在,如果我想将触发时间从 1 分钟更改为 2 分钟,我必须重新部署代码。相反,有一种方法可以从配置文件中使 TimeTrigger 可配置。
请注意,无法使用动态读取的值替换字符串,因为 TimerTrigger 属性是常量字符串表达式或类型。
AFAIK,您需要在代码中为 TimerTrigger
指定 scheduleExpression
参数,或者实施此示例 TimerSamples.cs. For changing the schedule without re-deploy your code, I assume that you could leverage Azure Scheduler to trigger your webjob on some schedule and you could change the schedule settings as you expected without re-deploy your webjob. For more details, you could refer to the section about adding a scheduler job in this tutorial 中描述的 WeeklySchedule
或 DailySchedule
.
经过大量挖掘,我意识到这可以通过 SDK 扩展来完成 class TimerSchedule
。
为此,您需要一个可以用于多个触发器的基础 class。
class CustomTimerTriggerBase: TimerSchedule
{
TimeSpan timer;
public CustomTimerTriggerBase(string triggerConfigKey)
{
timer=TimeSpan.Parse(ConfigurationManager.AppSettings[triggerConfigKey]);
}
public override DateTime GetNextOccurrence(DateTime now)
{
return now.Add(timer);
}
}
使用这个 Base 来生成你的计时器...
public sealed class FooTimer : CustomTimerTriggerBase
{
public FooTimer() : base("FooTimerKey") {}
}
在您的 App.config 中有 "FooTimer"
的密钥<add key="FooTimerKey" value="00:02:00" />
在您的网络作业函数中使用此 FooTimer class。
public void foo([TimerTrigger(typeof(FooTimer)] TimerInfo timer)
现在您只需更改应用配置中的值即可,无需重新部署代码。 注意:由于您正在使用 Timespan 进行解析,因此字符串可以是您需要的任何格式,如 TimeSpan 格式中所定义。
更新
正如 l--''''''---------'''''''''''' 和 Andy Dobedoe 所指出的 现在(截至 2019 年)实现此目标要简单得多。
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
找到名为 MYCRON 的设置并使用那里的 cron 表达式
事实证明,现在这很容易。只需将应用程序设置作为您的 cron 计划表达式,它就会为您查找。
例如
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
找到名为 MYCRON 的设置并使用那里的 cron 表达式
您可以这样做:
public static void Run([TimerTrigger("%MYSCHEDULE%")] TimerInfo myTimer, ILogger log)
其中 MYSCHEDULE
是一个环境变量,您可以将其存储在 local.settings.json
文件以及门户中的应用程序设置中。
MYSCHEDULE
的示例值为:
"MYSCHEDULE": "0 */2 * * * *"