Scheduling job using Quartz.Net
Quartz consists of jobs, triggers and schedulers. Job is task that needs to be executed and trigger is how the job will be executed. Scheduler schedules the jobs and jobs and triggers have to be registered with it.- Nuget package: Quartz.Net
- Create job factory to create multiple jobs
- Create JobSchedule which takes the type of job and cron expression
- Create a job DateTimeJob which writes DateTime to file
- Create JobScheduler and register job and trigger to it
- Create QuartzHostedService
- Add below to Startup.cs/ConfigureServices
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | namespace Web.Models { public class JobFactory : IJobFactory { private readonly IServiceProvider _serviceProvider; public JobFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } public IJob NewJob(TriggerFiredBundle bundle, IScheduler scheduler) { return _serviceProvider.GetService(bundle.JobDetail.JobType) as IJob; } public void ReturnJob(IJob job) { } } } |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | namespace Web.Models { [DisallowConcurrentExecution] public class DateTimeJob : IJob { private readonly ILogger<DateTimeJob> _logger; public DateTimeJob(ILogger<DateTimeJob> logger) { _logger = logger; } public Task Execute(IJobExecutionContext context) { _logger.LogInformation($"Time is : {DateTime.Now}"); //using (StreamWriter sw = new StreamWriter(@"C:\Mrugjal-time.txt",true) ) //{ // sw.Write(DateTime.Now.ToUniversalTime()); //} return Task.CompletedTask; //return Task.FromResult(0); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | namespace Web.Models { public class JobScheduler { public static void Start() { IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler().Result; scheduler.Start(); IJobDetail job = JobBuilder.Create<DateTimeJob>().Build(); ITrigger trigger = TriggerBuilder.Create() .WithIdentity("DateTimeJob", "DateTime") .WithCronSchedule("0 1 * * * ?") .StartAt(DateTime.Now.ToUniversalTime()) .WithPriority(1) .Build(); scheduler.ScheduleJob(job, trigger); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | namespace Web.Services { public class QuartzHostedService: IHostedService { private readonly ISchedulerFactory _schedulerFactory; private readonly IJobFactory _jobFactory; private readonly IEnumerable<JobSchedule> _jobSchedule; public QuartzHostedService( ISchedulerFactory schedulerFactory, IJobFactory jobFactory, IEnumerable<JobSchedule> jobSchedule) { _schedulerFactory = schedulerFactory; _jobSchedule = jobSchedule; _jobFactory = jobFactory; } public IScheduler Scheduler { get; set; } public async Task StartAsync(CancellationToken cancellationToken) { Scheduler = await _schedulerFactory.GetScheduler(cancellationToken); Scheduler.JobFactory = _jobFactory; foreach (var jobSchedule in _jobSchedule) { var job = CreateJob(jobSchedule); var trigger = CreateTrigger(jobSchedule); await Scheduler.ScheduleJob(job, trigger, cancellationToken); } await Scheduler.Start(); } private static IJobDetail CreateJob(JobSchedule jobSchedule) { var jobType = jobSchedule.JobType; return JobBuilder .Create(jobSchedule.JobType) .WithIdentity(jobType.FullName) .Build(); } private static ITrigger CreateTrigger(JobSchedule jobSchedule) { return TriggerBuilder .Create() .WithIdentity(jobSchedule.JobType.FullName) .WithCronSchedule(jobSchedule.Cron) .WithDescription(jobSchedule.Cron) .Build(); } public async Task StopAsync(CancellationToken cancellationToken) { await Scheduler.Shutdown(cancellationToken); } } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 | public void ConfigureServices(IServiceCollection services) { ... services.AddSingleton<IJobFactory, JobFactory>(); services.AddSingleton<ISchedulerFactory, StdSchedulerFactory>(); services.AddSingleton<DateTimeJob>(); services.AddSingleton(new JobSchedule(jobType: typeof(DateTimeJob), cron: "0 0/1 * * * ?")); services.AddHostedService<QuartzHostedService>(); } |