added scheduler system
parent
b1f73d73ef
commit
2abd63e42e
@ -0,0 +1,132 @@
|
|||||||
|
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()}";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,13 @@
|
|||||||
|
namespace Common.Library.JobScheduler
|
||||||
|
{
|
||||||
|
public class SchedulerEnums
|
||||||
|
{
|
||||||
|
public enum TaskRunInterval
|
||||||
|
{
|
||||||
|
Seconds,
|
||||||
|
Minutes,
|
||||||
|
Hours,
|
||||||
|
Cron
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue