8

我正在建立一个定期触发的工作(比如 1 分钟)。我已经成功地在函数中使用了时间跨度硬编码的触发网络作业。

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

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

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

4

4 回答 4

10

经过大量挖掘,我意识到这可以通过 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);
    }
}

使用这个基地来生成你的计时器......

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)

现在您可以简单地更改应用配置中的值,而不是重新部署代码。 注意:由于您使用 Timespan 进行解析,因此字符串可以是您需要的任何格式,如 TimeSpan 格式中定义的那样。


更新

正如l--'''''---------''''''''''''Andy Dobedoe 现在(截至 2019 年)所指出的,实现这一点要简单得多。

public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer

找到名为 MYCRON 的设置并从那里使用 cron 表达式

于 2017-09-25T05:23:13.037 回答
10

你可以这样做:

public static void Run([TimerTrigger("%MYSCHEDULE%")] TimerInfo myTimer, ILogger log)

whereMYSCHEDULE是一个环境变量,您可以将其存储在local.settings.json文件中以及门户中的应用程序设置中。

的示例值为MYSCHEDULE

"MYSCHEDULE": "0 */2 * * * *"
于 2018-12-25T21:13:13.403 回答
8

事实证明,这在当今很容易。只需将应用程序设置作为您的 cron 计划表达式,它就会为您查找。

例如

public static async Task RunAsync([TimerTrigger("%MYCRON%")]TimerInfo myTimer

找到名为 MYCRON 的设置并从那里使用 cron 表达式

于 2018-10-15T10:20:00.113 回答
1

AFAIK,您需要在代码中指定scheduleExpression参数TimerTrigger或实现您的WeeklyScheduleDailySchedule在此示例TimerSamples.cs中描述的参数。为了在不重新部署代码的情况下更改计划,我假设您可以利用Azure Scheduler在某个计划上触发您的 Web 作业,并且您可以按预期更改计划设置而无需重新部署您的 Web 作业。有关详细信息,您可以参考本教程中有关添加调度程序作业的部分。

于 2017-08-29T07:44:13.893 回答