本文已参与「新人创作礼」活动,一起开启掘金创作之路。
Quartz 封装 定时任务 以及可视化管理
// 需要执行Job的抽象类
public abstract class ScheduledTaskBase
{
public abstract Task RunAsync();
}
public class QuartzHelper
{
// 存储Job的队列 可视化可以用
public Dictionary<string, ScheduledTaskBase> QuartzList=new Dictionary<string, ScheduledTaskBase>();
IScheduler scheduler;
public QuartzHelper()
{
StdSchedulerFactory factory = new StdSchedulerFactory();
scheduler = factory.GetScheduler().Result;
scheduler.Start().Wait();
}
/// <summary>
/// 添加循环定时任务
/// </summary>
/// <typeparam name="T">被执行的类</typeparam>
/// <param name="Seconds">毫秒</param>
/// <returns></returns>
public string SetIntervalJob<T> (int Seconds) where T : ScheduledTaskBase
{
// 实例化对象
ScheduledTaskBase Job = Activator.CreateInstance<T>();
string JobKey= Guid.NewGuid().ToString();
IDictionary<string, object> jbData = new Dictionary<string, object>();
jbData.Add(JobKey, Job);
IJobDetail job1 = JobBuilder.Create<JobInstance>()
.WithIdentity(JobKey)
.SetJobData(new JobDataMap(jbData)).Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(JobKey)
.StartNow()
.WithSimpleSchedule(x => x.WithIntervalInSeconds(Seconds)
.RepeatForever())
.Build();
QuartzList.Add(JobKey,Job);
AsyncHelper.RunSync(() => scheduler.ScheduleJob(job1, trigger));
return JobKey;
}
public string SetDailyJob<T>(int h, int m, int s) where T : ScheduledTaskBase
{
ScheduledTaskBase Job = Activator.CreateInstance<T>();
string JobKey = Guid.NewGuid().ToString();
IDictionary<string, object> jbData = new Dictionary<string, object>();
jbData.Add(JobKey, Job);
IJobDetail job1 = JobBuilder.Create<JobInstance>()
.WithIdentity(JobKey)
.SetJobData(new JobDataMap(jbData)).Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(JobKey)
.StartNow()
.WithCronSchedule($"{s} {m} {h} * * ?")//每天定时
.Build();
AsyncHelper.RunSync(() => scheduler.ScheduleJob(job1, trigger));
QuartzList.Add(JobKey,Job);
return JobKey;
}
public string SetDelayJob<T>(TimeSpan delay) where T : ScheduledTaskBase
{
ScheduledTaskBase Job = Activator.CreateInstance<T>();
string JobKey = Guid.NewGuid().ToString();
IDictionary<string, object> jbData = new Dictionary<string, object>();
jbData.Add(JobKey, Job);
IJobDetail job1 = JobBuilder.Create<JobInstance>()
.WithIdentity(JobKey)
.SetJobData(new JobDataMap(jbData)).Build();
ITrigger trigger = TriggerBuilder.Create()
.WithIdentity(JobKey)
.StartNow()
.WithSimpleSchedule(x => x.WithRepeatCount(0).WithInterval(delay))
.Build();
AsyncHelper.RunSync(() => scheduler.ScheduleJob(job1, trigger));
QuartzList.Add(JobKey, Job);
return JobKey;
}
/// <summary>
/// 删除任务
/// </summary>
/// <param name="JobKey"></param>
public bool RemoveJob(string JobKey)
{
try
{
AsyncHelper.RunSync(() => scheduler.DeleteJob(new JobKey(JobKey)));
QuartzList.Remove(JobKey);
return true;
}
catch (Exception )
{
return false;
}
}
/// <summary>
/// 暂停所有Job
/// </summary>
/// <returns></returns>
public bool PauseAllJobs()
{
try
{
scheduler.PauseAll();
return true;
}
catch (Exception )
{
return false;
}
}
/// <summary>
/// 恢复所有任务
/// </summary>
/// <returns></returns>
public bool ResumeAllJobs()
{
try
{
scheduler.ResumeAll();
return true;
}
catch (Exception )
{
return false;
}
}
/// <summary>
/// 恢复任务
/// </summary>
/// <param name="jobId"></param>
public void ResumeJob(string jobId)
{
AsyncHelper.RunSync(() => scheduler.ResumeJob(new JobKey(jobId)));
}
/// <summary>
/// 关闭所有任务,清理资源再也无法开始
/// </summary>
/// <returns></returns>
public bool ShutDownAllJobs()
{
try
{
if (!scheduler.IsShutdown)
{
scheduler.Shutdown();
QuartzList.Clear();
}
return true;
}
catch (Exception )
{
return false;
}
}
/// <summary>
/// 启动所有Job
/// </summary>
/// <returns></returns>
public bool StartAllJob()
{
try
{
scheduler.Start();
return true;
}
catch (Exception )
{
return false;
}
}
/// <summary>
/// 暂停单个Job
/// </summary>
/// <param name="JobKey">任务Id</param>
public bool StopJob(string JobKey)
{
try
{
AsyncHelper.RunSync(() => scheduler.PauseJob(new JobKey(JobKey)));
return true;
}
catch (Exception )
{
return false;
}
}
// 启动Job的 内部类
private class JobInstance : IJob
{
public async Task Execute(IJobExecutionContext context)
{
IDictionary<string, object> jobs = context.JobDetail.JobDataMap;
if (jobs != null)
{
ScheduledTaskBase jobObj = jobs.Values.FirstOrDefault() as ScheduledTaskBase;
await jobObj.RunAsync();
}
}
}
}
//调用方式
1 首先需要创建一个要执行的类 继承ScheduledTaskBase
public class Test01:ScheduledTaskBase{
public async override RunAsync(){
// 执行的方法体
}
}
// 这里可以直接用依赖注入在使用的地方 然后统一的操作一下就可以了方便给大家看 new 对象
QuartzHelper q=new QuartzHelper();
q.SetIntervalJob<Test01>(1)
//类 加循环执行的秒数