Net Core Quartz定时任务 可视化

329 阅读2分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

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)  
	//类 加循环执行的秒数