GitHub Copilot Customization Explained for Beginners: Instructions, Prompt Files, Skills, Agents, and Hooks  Introduction If you've recently started using GitHub Copilot, you've probably come across terms like Instructions , Prompt Files , Skills , Agents , and Hooks . At first glance, they all seem to do the same thing—they tell Copilot what to do. So why does GitHub have five different customization features? The answer is simple: each feature solves a different problem. Think of GitHub Copilot as a new developer joining your team. On their first day, you don't just hand them code. You explain your coding standards, give them reusable templates, teach them specialized knowledge, assign them a role, and automate repetitive tasks. That's exactly how GitHub Copilot customization works. In this article, you'll learn what each feature does, when to use it, and how they all work together. By the end, you'll know which feature to start with and which ones can wait un...

Azure WebJob - configurable Cron Expression

Azure WebJobs is a feature of Azure App Service that enables you to run a program or script in the same context as a web app, API app, or mobile app. Azure WebJob are ideal for running long running background tasks in cloud.

There are 2 types of web job:
  1. Continuous web job
  2. Triggered web job
    • Manual triggered web job
    • Scheduled triggered web job
Scheduled triggered WebJob will be executed based on provided CRON expression.The scheduling is done with a TimerTrigger that takes in a cron expression as argument as shown below


public async Task TimerTriggerFunction([TimerTrigger("0 */5 * * * *", RunOnStartup = true)]
 TimerInfo timerInfo, CancellationToken cancellationToken)
        {
            //Some logic goes here...
            _demo.SomeAction();
        }

Above code snippet shows CRON expression which is scheduled run every 5 minutes. Which is absolutely fine but when you are building enterprise grade solution we want job to be flexible enough to run at different time intervals based on environment. E.g. In Development environment we might need to run every 5mins when its promoted to SIT environment we want to run once a day based on the schedule configured. To cater the above requirement we want to simply make the CRON expression configurable.

.NET Core with WebJobs SDK versions 3.x

Version 3.x adds support for .NET Core. Visual Studio tooling for .NET Core (3.x) projects differs from tooling for .NET Framework (2.x) projects. 

Which means its been simplified as shown below

In Appsetting.json we define CRON expression just like any other configuration

"ScheduleAppSetting": "0 */5 * * * *"

In your code following changes needs to changed as shown below where you can put the schedule expression in an app setting and set this property to the app setting name wrapped in % signs, as in this example: "%ScheduleAppSetting%".


public async Task TimerTriggerFunction([TimerTrigger("%ScheduleAppSetting%", RunOnStartup = true)]
TimerInfo timerInfo, CancellationToken cancellationToken)
        {
            //Some logic goes here...
            _demo.SomeAction();
        }

.NET Core with WebJobs SDK versions 2.x

In this version (old version) of WebJob it will be app.config rather appsetting.json which is part of .NET Core as shown above.Implementing INameResolver, we can dynamically resolve a string name


public class ScheduleExpressionResolver : INameResolver
{
    public string Resolve(string name)
    {
        return ConfigurationManager.AppSettings[name];
    }
} 

App.config entry looks like below


<appSettings>
    <add key="WorkerRole.Cron.Job.Schedule.Expression" value="0 0 2 * * *" />
</appsettings>

We have to then set the NameResolver property on the JobHostConfiguration object to an instance of the expression resolver when creating the WebJob. Below is the code snippet for the same



var config = new JobHostConfiguration();
        if (config.IsDevelopment) {
            config.UseDevelopmentSettings();
        }
config.NameResolver = new ScheduleExpressionResolver(); 

Finally substitute the cron expression with the configuration variable name surrounded with percentage symbol 



public async Task TimerTriggerFunction([TimerTrigger("%WorkerRole.Cron.Job.Schedule.Expression%",
 RunOnStartup = true)] TimerInfo timerInfo, CancellationToken cancellationToken)
        {
            //Some logic goes here...
            _demo.SomeAction();
        }

References

https://docs.microsoft.com/en-us/azure/app-service/webjobs-create
https://rajurh.blogspot.com/2019/10/azure-webjob-using-net-core.html

Comments

Unknown said…
Very nice one Raju , This really helps !! , keep up the good work

Popular posts from this blog

Tidy up - Unused Project and Nuget package reference using Visual Studio 2019

Azure Front Door vs Azure Traffic Manager?

Authenticate Azure Functions - API Keys