可配置的计时器触发器 - Azure Web作业

时间:2017-08-29 05:02:11

标签: c# azure-webjobs azure-webjobssdk webjob

我正在建立一个工作,以一定的间隔(比如1分钟)触发。我已成功使用触发式Web作业,并在函数中使用时间跨度硬编码。

public void foo([TimerTrigger("00:01:00")] TimerInfo timer)

现在,如果我想将触发时间从1分钟更改为2分钟,我将重新部署代码。相反,有一种方法可以从配置文件中使TimeTrigger可配置。

请注意,无法使用动态读取值替换字符串,因为TimerTrigger属性是常量字符串表达式或类型。

4 个答案:

答案 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中描述的TimerTriggerWeeklySchedule。为了在不重新部署代码的情况下更改计划,我假设您可以利用Azure Scheduler按计划触发您的webjob,并且可以按预期更改计划设置,而无需重新部署您的webjob。有关更多详细信息,请参阅此tutorial中有关添加计划程序作业的部分。