Search code examples
c#azure-webjobsazure-webjobssdkwebjob

Configurable Timer Triggers - Azure Web Jobs


I'm building a job to trigger at some regular interval (say 1 minute). I've successfully used triggered web jobs with time-span hard coded in the functions.

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

Now if I ever want to change the trigger time from 1-min to 2-min I've to redeploy the code. Instead is there a way to make the TimeTrigger Configurable, from a config file.

Note that replacing the string with a dynamically read value isn't possible as the TimerTrigger Attribute is a const string expression or a Type.


Solution

  • After much digging, I've realized that this can be done with an SDK extension class TimerSchedule.

    For it, you would need a base class that you'll be able to use for multiple triggers.

    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);
        }
    }
    

    Use this Base to generate your timers...

    public sealed class FooTimer : CustomTimerTriggerBase
    {
        public FooTimer() : base("FooTimerKey") {}
    }
    

    In your, App.config have a key for "FooTimer"

    <add key="FooTimerKey" value="00:02:00" />
    

    Use this FooTimer class in your webjob functions.

    public void foo([TimerTrigger(typeof(FooTimer)] TimerInfo timer)
    

    Now you can simply change the value in app config instead of redeploying the code. NOTE: Since you are using Timespan to parse, the string can be of any format you need as defined in TimeSpan formats.


    UPDATE

    As pointed by l--''''''---------'''''''''''' and Andy Dobedoe now (as of 2019) it is much simpler to achieve this.

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

    Finds the setting called MYCRON and uses the cron expression from there