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
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)
{
}
}
}
|
- Create JobSchedule which takes the type of job and cron expression
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| namespace Web.Models
{
public class JobSchedule
{
public JobSchedule (Type jobType, string cron)
{
JobType = jobType;
Cron = cron;
}
public Type JobType { get; set; }
public string Cron { get; set; }
}
}
|
|
- Create a job DateTimeJob which writes DateTime to file
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);
}
}
}
|
- Create JobScheduler and register job and trigger to it
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);
}
}
}
|
- Create QuartzHostedService
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);
}
}
}
|
- Add below to Startup.cs/ConfigureServices
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>();
}
|
No comments:
Post a Comment