Quartz 定时器

有时我们需要系统帮我们定时自动执行一些东西,这里用到 Quartz.net

Quartz.Net是纯净的,它是一个.Net程序集,是非常流行的Java作业调度系统Quartz的C#实现。

Quartz.Net一款功能齐全的任务调度系统,从小型应用到大型企业级系统都能适用。功能齐全体现在触发器的多样性上面,即支持简单的定时器,也支持Cron表达式;即能执行重复的作业任务,也支持指定例外的日历;任务也可以是多样性的,只要继承IJob接口即可。

对于小型应用,Quartz.Net可以集成到你的系统中,对于企业级系统,它提供了Routing支持,提供了Group来组织和管理任务,此外还有持久化、插件功能、负载均衡和故障迁移等满足不同应用场景的需要。

为了灵活使用,下面分享的是如何动态创建编辑任务

安装:Install-Package Quartz -Version 3.0.7
或者在 NuGet 中引用
帮助类:
public class QuartzConfigHelper
    {

        private static ISchedulerFactory sf = new StdSchedulerFactory();    //创建一个调度器工厂
        private static String JOB_GROUP_NAME = ConfigurationManager.AppSettings["QuartzJobGroupName"];
        private static String TRIGGER_GROUP_NAME = ConfigurationManager.AppSettings["QuartzTriggerGroupName"];
        private static IScheduler sched;            //创建一个调度器    
        #region 动态创建和编辑任务
        /// <summary>
        /// 创建一个定时任务
        /// </summary>
        /// <param name="jobName"></param>
        /// <param name="jobType"></param>
        /// <param name="jobkey"></param>
        /// <param name="time"></param>
        public static void StartJob(string jobName, Type jobType, string jobKeyname, string time)
        {
            sched = sf.GetScheduler().Result;              //工厂生成一个调度器 

            JobDetailImpl jobDetail = new JobDetailImpl();      //新建一个任务 
            jobDetail.Name = jobName;
            jobDetail.Group = JOB_GROUP_NAME;
            jobDetail.Key = new JobKey(jobKeyname); //JobKey.Create(jobkey);
            jobDetail.JobType = jobType;

            CronTriggerImpl trigger = new CronTriggerImpl(jobName, TRIGGER_GROUP_NAME);//新建一个触发器  
            trigger.CronExpressionString = time;   //Cron表达式
            sched.ScheduleJob(jobDetail, trigger); //将任务与触发器添加到调度器中 
            if (!sched.IsShutdown)
            {
                sched.Start();
            }
        }

        /**   
         * 从Scheduler 移除当前的Job,修改Trigger   
         *    
         * @param jobDetail   
         * @param time   
         * @throws SchedulerException   
         * @throws ParseException   
         */
        public static void ModifyJobTime(string jobName, Type jobType, string jobKeyname, string time, bool IsEdit = true)
        {
            sched = sf.GetScheduler().GetAwaiter().GetResult();
            //创建之前的trigger
            CronTriggerImpl trigger = new CronTriggerImpl(jobName, TRIGGER_GROUP_NAME);

            //创建之前的job
            JobDetailImpl jobDetail = new JobDetailImpl();      //新建一个任务 
            jobDetail.Name = jobName;
            jobDetail.Group = JOB_GROUP_NAME;
            jobDetail.Key = new JobKey(jobKeyname); //JobKey.Create(jobkey);
            jobDetail.JobType = jobType;

            // 移除当前进程的Job     
            sched.DeleteJob(jobDetail.Key);
            if (IsEdit)
            {
                // 修改Trigger     
                trigger.CronExpressionString = time;
                // 重新调度jobDetail       
                sched.ScheduleJob(jobDetail, trigger);
            }
        }
        /// <summary>
        /// 停止任务
        /// </summary>
        public static void ShutDownJob()
        {
            if (sched != null && !sched.IsShutdown)
            {
                sched.Shutdown();
            }
        }
        #endregion
    }
创建一个Job:
public class HelloQuartz:IJob
    {
        /// <summary>
        /// 执行方法
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public async Task Execute(IJobExecutionContext context)
        {
            //执行一些操作
                        
        }
    }
调用:
string str = TimeToCron.TimeToQuartzCron(timestr);
QuartzConfigHelper.StartJob(ID.ToString(), typeof(HelloQuartz), ID.ToString(), str);
 时间格式转换成Quartz任务调度器Cron表达式
public class TimeToCron
    {
        /// <summary>
        /// 时间格式转换成Quartz任务调度器Cron表达式
        /// </summary>
        /// <param name="timeStr">时间值,支持yyyy-MM-dd HH:mm:ss | HH:mm</param>
        /// <returns></returns>
        public static string TimeToQuartzCron(string timeStr)
        {
            try
            {
                if (string.IsNullOrWhiteSpace(timeStr))
                {
                    return "";
                }
                //日期
                string date = Convert.ToDateTime(timeStr).ToString("yyyy-MM-dd");
                DateTime dt = DateTime.Parse(date);
                //时间
                string time = Convert.ToDateTime(timeStr).ToString("HH:mm:ss");
                string error = "传入的时间值[" + timeStr + "]格式有误!";
                int ss = 0, mi = 0, hh = 0;
                if (time.Length < 5)
                {
                    throw new Exception(error);
                }
                if (time.Substring(2, 1) != ":")
                {
                    throw new Exception(error);
                }
                if (!int.TryParse(time.Substring(0, 2), out hh))
                {
                    throw new Exception(error);
                }
                if (!int.TryParse(time.Substring(3, 2), out mi))
                {
                    throw new Exception(error);
                }
                if (time.Length > 5)
                {
                    if (time.Substring(5, 1) != ":")
                    {
                        throw new Exception(error);
                    }
                    if (!int.TryParse(time.Substring(6), out ss))
                    {
                        throw new Exception(error);
                    }
                }
                if (ss > 59)
                {
                    throw new Exception(error);
                }
                if (mi > 59)
                {
                    throw new Exception(error);
                }
                if (hh > 23)
                {
                    throw new Exception(error);
                }
                string cronValue = ss + " " + mi + " " + hh + " " + dt.Day.ToString() + " " + dt.Month.ToString() + " ? " + dt.Year.ToString();
                return cronValue;
            }
            catch (Exception ea)
            {
                throw ea;
            }
        }
}
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容