2017-08-29 43 views
-1

我正在构建一个工作,以某个定期间隔(比如1分钟)触发。我已成功使用触发的Web作业,其时间间隔硬编码在函数中。可配置的计时器触发器 - Azure Web Jobs

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

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

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

回答

2

经过大量挖掘,我意识到这可以通过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格式中定义的任何格式的字符串。

0

据我所知,您需要为特定的TimerTrigger参数scheduleExpression你的代码或者实现你WeeklySchedule或该样品TimerSamples.cs描述DailySchedule。为了在不重新部署代码的情况下更改日程安排,我假设您可以利用Azure Scheduler在某个时间表上触发您的网络工作,并且可以按预期更改日程安排设置,而无需重新部署您的网络工作。有关更多详细信息,请参阅有关在此tutorial中添加调度程序作业的部分。

+1

感谢您的回答。我一直在寻找一种更可配置的方式,而不仅仅是每周或每日安排。我想通过内置的Azure SDK的'TimerSchedule'扩展名来实现这一点。它与'WeeklyScedule'和'DailySchedule'基本相同,具有更多控制权。 –