You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
132 lines
6.6 KiB
C#
132 lines
6.6 KiB
C#
using System;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Collections.Specialized;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using Quartz;
|
|
using Quartz.Impl;
|
|
using Microsoft.Extensions.Configuration;
|
|
|
|
namespace Common.Library.JobScheduler
|
|
{
|
|
public class Scheduler
|
|
{
|
|
protected StdSchedulerFactory SchedulerFactory { get; set; }
|
|
protected CancellationToken CancellationToken { get; set; }
|
|
protected IScheduler JobScheduler { get; set; }
|
|
|
|
public Scheduler()
|
|
{
|
|
var properties = new NameValueCollection { { "quartz.threadPool.threadCount", "1" } };
|
|
|
|
SchedulerFactory = new StdSchedulerFactory(properties);
|
|
}
|
|
|
|
public struct JobDetails
|
|
{
|
|
public Type JobType { get; set; }
|
|
public string JobName { get; set; }
|
|
public SchedulerEnums.TaskRunInterval JobRunInterval { get; set;}
|
|
public int JobTimeInterval { get; set; }
|
|
public string CronExpression { get; set; }
|
|
public IConfiguration Config { get; set; }
|
|
}
|
|
|
|
protected async Task StartJobScheduler()
|
|
{
|
|
JobScheduler = await SchedulerFactory.GetScheduler();
|
|
await JobScheduler.Start();
|
|
}
|
|
|
|
protected async Task AddJob(JobDetails jobDetails)
|
|
{
|
|
|
|
IDictionary dataMap = new Dictionary<string, IConfiguration>() { { "Config", jobDetails.Config } };
|
|
|
|
IJobDetail jobInfo = JobBuilder.Create(jobDetails.JobType)
|
|
.WithIdentity(jobDetails.JobName, "Jobs")
|
|
.UsingJobData(new JobDataMap(dataMap))
|
|
.Build();
|
|
|
|
ITrigger triggerInfo = null;
|
|
|
|
switch (jobDetails.JobRunInterval)
|
|
{
|
|
case SchedulerEnums.TaskRunInterval.Seconds:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity(GetTriggerName(jobDetails.JobName, jobDetails.JobTimeInterval, jobDetails.JobRunInterval), "Jobs")
|
|
.StartNow()
|
|
.WithSimpleSchedule(val => val.WithIntervalInSeconds(jobDetails.JobTimeInterval).RepeatForever())
|
|
.Build();
|
|
break;
|
|
case SchedulerEnums.TaskRunInterval.Minutes:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity(GetTriggerName(jobDetails.JobName, jobDetails.JobTimeInterval, jobDetails.JobRunInterval), "Jobs")
|
|
.StartNow()
|
|
.WithSimpleSchedule(val => val.WithIntervalInMinutes(jobDetails.JobTimeInterval).RepeatForever())
|
|
.Build();
|
|
break;
|
|
case SchedulerEnums.TaskRunInterval.Hours:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity(GetTriggerName(jobDetails.JobName, jobDetails.JobTimeInterval, jobDetails.JobRunInterval), "Jobs")
|
|
.StartNow()
|
|
.WithSimpleSchedule(val => val.WithIntervalInHours(jobDetails.JobTimeInterval).RepeatForever())
|
|
.Build();
|
|
break;
|
|
case SchedulerEnums.TaskRunInterval.Cron:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity($"trigger_{jobDetails.JobName}_with_cron_schedule", "Jobs")
|
|
.StartNow()
|
|
.WithCronSchedule(jobDetails.CronExpression)
|
|
.Build();
|
|
break;
|
|
}
|
|
|
|
await JobScheduler.ScheduleJob(jobInfo, triggerInfo, CancellationToken);
|
|
}
|
|
|
|
protected async Task AddOneRunJob(JobDetails jobDetails)
|
|
{
|
|
|
|
IDictionary dataMap = new Dictionary<string, IConfiguration>() { { "Config", jobDetails.Config } };
|
|
|
|
IJobDetail jobInfo = JobBuilder.Create(jobDetails.JobType)
|
|
.WithIdentity(jobDetails.JobName, "Jobs")
|
|
.UsingJobData(new JobDataMap(dataMap))
|
|
.Build();
|
|
|
|
ITrigger triggerInfo = null;
|
|
|
|
switch (jobDetails.JobRunInterval)
|
|
{
|
|
case SchedulerEnums.TaskRunInterval.Seconds:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity(GetTriggerName(jobDetails.JobName, jobDetails.JobTimeInterval, jobDetails.JobRunInterval), "Jobs")
|
|
.StartNow()
|
|
.WithSimpleSchedule(val => val.WithIntervalInSeconds(jobDetails.JobTimeInterval))
|
|
.Build();
|
|
break;
|
|
case SchedulerEnums.TaskRunInterval.Minutes:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity(GetTriggerName(jobDetails.JobName, jobDetails.JobTimeInterval, jobDetails.JobRunInterval), "Jobs")
|
|
.StartNow()
|
|
.WithSimpleSchedule(val => val.WithIntervalInMinutes(jobDetails.JobTimeInterval))
|
|
.Build();
|
|
break;
|
|
case SchedulerEnums.TaskRunInterval.Hours:
|
|
triggerInfo = TriggerBuilder.Create()
|
|
.WithIdentity(GetTriggerName(jobDetails.JobName, jobDetails.JobTimeInterval, jobDetails.JobRunInterval), "Jobs")
|
|
.StartNow()
|
|
.WithSimpleSchedule(val => val.WithIntervalInHours(jobDetails.JobTimeInterval))
|
|
.Build();
|
|
break;
|
|
}
|
|
|
|
await JobScheduler.ScheduleJob(jobInfo, triggerInfo, CancellationToken);
|
|
}
|
|
|
|
private string GetTriggerName(string jobName, int jobTimeInterval, SchedulerEnums.TaskRunInterval jobRunInterval) =>
|
|
$"trigger_{jobName}_every_{jobTimeInterval}_{Enum.GetName(typeof(SchedulerEnums.TaskRunInterval), jobRunInterval).ToLower()}";
|
|
}
|
|
} |