Search code examples
.netasp.net-corehangfire

How to create a cron like job using HangFire at startup?


I have a service class that has a method like

public void BackgroundJob(string cronrule)
{
    RecurringJob.AddOrUpdate("somejob", () => FetchCallHistoryAsync(), cronrule);
}

I want to put start the job in the startup, something like this

public void ConfigureServices(IServiceCollection services)
{
    ...
    new MyClass().BackgroundJob("10 * * * *")
}

But my class depends on several other services, I don't know how to instantiate it from Startup.cs, any idea?


Solution

  • Okay I found a way

    For any cases that you need to instantiate a service at startup, you register it at ConfigureServices(IServiceCollection services) and then inject it in Configure(YourService yserv)

    For my special case I created a CrontabService

    namespace MyApp
    {
        public class CrontabService
        {
            private DependentService D;
            public CrontabService(DependentService d)
            {
                  D = d
            }
    
            public Start()
            {
                  RecurringJob.AddOrUpdate("some-id", () => D.Job(), "*/15 * * * *");
            }
        }
    }
    

    This way all my crontab jobs stay on the same service.

    Then I start it at Startup.cs::Configure

    // Startup.cs
         public void ConfigureServices(IServiceCollection services)
         {
             ...
             services.AddSingleton<DepedentService>();
             services.AddSingleton<CrontabService>();
          }
    ...
         public void Configure(IApplicationBuilder app, IWebHostEnvironment env, IServiceProvider serviceProvider, CrontabService cron)
         {
              ...
              cron.Start();
              ...
         }
    ...