我正在建立一个工作,以一定的间隔(比如1分钟)触发。我已成功使用触发式Web作业,并在函数中使用时间跨度硬编码。
public void foo([TimerTrigger("00:01:00")] TimerInfo timer)
现在,如果我想将触发时间从1分钟更改为2分钟,我将重新部署代码。相反,有一种方法可以从配置文件中使TimeTrigger可配置。
请注意,无法使用动态读取值替换字符串,因为TimerTrigger属性是常量字符串表达式或类型。
答案 0 :(得分:8)
经过深入挖掘后,我意识到可以使用SDK扩展类TimerSchedule
完成此操作。
对于它,你需要一个你可以用于多个触发器的基类。
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" />
在webjob函数中使用此FooTimer类。
public void foo([TimerTrigger(typeof(FooTimer)] TimerInfo timer)
现在您只需更改app config中的值,而不是重新部署代码。 注意:由于您使用Timespan进行解析,因此字符串可以是TimeSpan格式中定义的任何格式。
答案 1 :(得分:3)
事实证明,如今这很容易。只需将应用程序设置作为您的cron计划表达式,它就会为您查找。
例如
public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer
找到名为MYCRON的设置,并从那里使用cron表达式
答案 2 :(得分:3)
您可以这样做:
public static void Run([TimerTrigger("%MYSCHEDULE%")] TimerInfo myTimer, ILogger log)
其中MYSCHEDULE
是一个环境变量,您可以将其存储在local.settings.json
文件以及门户网站的应用程序设置中。
MYSCHEDULE
的示例值为:
"MYSCHEDULE": "0 */2 * * * *"
答案 3 :(得分:1)
AFAIK,您需要在代码中指定scheduleExpression
的{{1}}参数,或者实施此示例TimerSamples.cs中描述的TimerTrigger
或WeeklySchedule
。为了在不重新部署代码的情况下更改计划,我假设您可以利用Azure Scheduler按计划触发您的webjob,并且可以按预期更改计划设置,而无需重新部署您的webjob。有关更多详细信息,请参阅此tutorial中有关添加计划程序作业的部分。