当前位置: 首页 > 工具软件 > Quartz EX > 使用案例 >

Quartz 任务调度

葛哲彦
2023-12-01

Quartz 任务调度

  1. 安装Quartz NuGet包 2.6.2版本
  2. 创建Job文件夹
  3. 创建QuartzHelper帮助类
    public class QuartzHelper
    {
        private static List<IScheduler> _listsche = new List<IScheduler>();
        /// <summary>
        /// 时间间隔执行任务
        /// </summary>
        /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
        /// <param name="seconds">时间间隔(单位:毫秒)</param>
        public static async System.Threading.Tasks.Task ExecuteIntervalAsync<T>(int seconds) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = await factory.GetScheduler();

            //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
            IJobDetail job = JobBuilder.Create<T>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .StartNow()
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).RepeatForever())
                .Build();

            _listsche.Add(scheduler);
            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();

        }

        /// <summary>
        /// 指定时间执行任务
        /// </summary>
        /// <typeparam name="T">任务类,必须实现IJob接口</typeparam>
        /// <param name="cronExpression">cron表达式,即指定时间点的表达式</param>
        public static void ExecuteByCron<T>(string cronExpression) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = (IScheduler)factory.GetScheduler();

            IJobDetail job = JobBuilder.Create<T>().Build();

            //DateTimeOffset startTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddSeconds(1), 2);
            //DateTimeOffset endTime = DateBuilder.NextGivenSecondDate(DateTime.Now.AddYears(2), 3);

            ICronTrigger trigger = (ICronTrigger)TriggerBuilder.Create()
               // .StartAt(startTime).EndAt(endTime)
               .WithCronSchedule(cronExpression)
                .StartNow()
                .Build();

            _listsche.Add(scheduler);
            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();

            //Thread.Sleep(TimeSpan.FromDays(2));
            //scheduler.Shutdown();
        }

        /// <summary>
        /// 每隔 seconds秒 ,重复执行times次  (如:times=-1重复执行;times=0只执行一次; 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="seconds"></param>
        /// <param name="times"></param>
        public static void ExecuteIntervalTime<T>(int seconds, int times) where T : IJob
        {
            try
            {
                ISchedulerFactory factory = new StdSchedulerFactory();
                IScheduler scheduler = (IScheduler)factory.GetScheduler();
                //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
                IJobDetail job = JobBuilder.Create<T>().Build();

                ITrigger trigger = TriggerBuilder.Create()
                    .StartNow()
                    .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(times))
                    .Build();

                _listsche.Add(scheduler);
                scheduler.ScheduleJob(job, trigger);
                scheduler.Start();
            }
            catch (Exception ex)
            {

            }
        }
        public static void ExecuteIntervalTime<T>(int seconds, int times, JobDataMap map) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = (IScheduler)factory.GetScheduler();
            //IJobDetail job = JobBuilder.Create<T>().WithIdentity("job1", "group1").Build();
            IJobDetail job = JobBuilder.Create<T>().Build();
            if (map != null)
            {
                foreach (var item in map)
                {
                    job.JobDataMap.Add(item);
                }
            }
            ITrigger trigger = TriggerBuilder.Create()
                .StartNow()
                .WithSimpleSchedule(x => x.WithIntervalInSeconds(seconds).WithRepeatCount(times))
                .Build();

            _listsche.Add(scheduler);
            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();
        }
        /// <summary>
        /// 每隔 minutes分钟 ,重复执行times次  (如:times=-1重复执行;times=0只执行一次; )
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="minutes"></param>
        /// <param name="times"></param>
        public static void ExecuteIntervalMinutesTime<T>(int minutes, int times) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = (IScheduler)factory.GetScheduler();
            IJobDetail job = JobBuilder.Create<T>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .StartNow()
                .WithSimpleSchedule(x => x.WithIntervalInMinutes(minutes).WithRepeatCount(times))
                .Build();

            _listsche.Add(scheduler);
            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();
        }
        /// <summary>
        /// 每隔 hours小时 ,重复执行times次  (如:times=-1重复执行;times=0只执行一次; )
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hours"></param>
        /// <param name="times"></param>
        public static void ExecuteIntervalHoursTime<T>(int hours, int times) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = (IScheduler)factory.GetScheduler();
            IJobDetail job = JobBuilder.Create<T>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .StartNow()
                .WithSimpleSchedule(x => x.WithIntervalInHours(hours).WithRepeatCount(times))
                .Build();

            _listsche.Add(scheduler);
            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();
        }


        /// <summary>
        /// 每天hours点minute分执行 
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="hours">小时</param>
        /// <param name="times">分钟</param>
        public static void ExecuteIntervalDailyTime<T>(int hours, int minute) where T : IJob
        {
            ISchedulerFactory factory = new StdSchedulerFactory();
            IScheduler scheduler = (IScheduler)factory.GetScheduler();
            IJobDetail job = JobBuilder.Create<T>().Build();

            ITrigger trigger = TriggerBuilder.Create()
                .StartNow()
                .WithSchedule(CronScheduleBuilder.DailyAtHourAndMinute(hours, minute))
                .Build();

            _listsche.Add(scheduler);
            scheduler.ScheduleJob(job, trigger);
            scheduler.Start();
        }
        /// <summary>
        /// 关闭所有工厂调度任务 
        /// </summary>
        public static void ShutdownJobs()
        {
            try
            {
                if (_listsche.Count > 0)
                {
                    foreach (var sched in _listsche)
                    {
                        if (!sched.IsShutdown)
                        {
                            // logclass.Info(string.Format("关闭任务调度:{0}", sched.SchedulerName));
                            sched.Shutdown();
                        }
                    }
                    _listsche.Clear();
                }
            }
            catch (Exception e)
            {
                //logclass.Error(string.Format("关闭任务调度,出错:{0}", e), e);
            }
        }


    }

    public class QuartzManager<T> where T : class, IJob
    {
        #region 变量
        private static ISchedulerFactory schedulerFactory = new StdSchedulerFactory();  //scheduler工厂
        private static String JOB_GROUP_NAME = "JOBGROUP_NAME"; //Job群组名
        private static String TRIGGER_GROUP_NAME = "TRIGGERGROUP_NAME"; //触发器群组名
        #endregion

        #region 添加,删除,修改Job方法
        /// <summary>
        /// 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 
        /// </summary>
        /// <param name="pStrJobName">任务名</param>
        /// <param name="pStrCronExpress">触发器表达式</param>
        public static void addJob(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)
        {
            try
            {
                IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
                // 创建任务
                IJobDetail job = JobBuilder.Create<T>()
                    .WithIdentity(pStrJobName, JOB_GROUP_NAME)
                    .Build();

                // 创建触发器
                ITrigger trigger = TriggerBuilder.Create()
                    .WithIdentity(pStrJobName, TRIGGER_GROUP_NAME)
                    .WithCronSchedule(pStrCronExpress)
                    .Build();

                //给任务传参数
                foreach (KeyValuePair<string, object> kvp in pDictionary)
                {
                    job.JobDataMap.Put(kvp.Key, kvp.Value);
                }

                sched.ScheduleJob(job, trigger);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 移除一个任务(使用默认的任务组名,触发器名,触发器组名) 
        /// </summary>
        /// <param name="pStrJobName">任务名称</param>
        public static void RemoveJob(string pStrJobName)
        {
            try
            {
                IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
                JobKey jobKey = new JobKey(pStrJobName);
                TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);
                sched.PauseTrigger(triggerKey);// 停止触发器  
                sched.UnscheduleJob(triggerKey);// 移除触发器  
                sched.DeleteJob(jobKey);// 删除任务  
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) 
        /// </summary>
        /// <param name="pStrJobName">任务名</param>
        /// <param name="pStrCronExpress">触发器表达式</param>
        public static void ModifyJobTime(string pStrJobName, string pStrCronExpress, IDictionary<string, object> pDictionary)
        {
            try
            {
                IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
                TriggerKey triggerKey = new TriggerKey(pStrJobName, TRIGGER_GROUP_NAME);
                ICronTrigger trigger = (ICronTrigger)sched.GetTrigger(triggerKey);
                if (trigger == null)
                {
                    return;
                }
                RemoveJob(pStrJobName);
                addJob(pStrJobName, pStrCronExpress, pDictionary);
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion

        #region 启动,关闭Job
        /// <summary>
        /// 启动所有定时任务 
        /// </summary>
        public static void startJobs()
        {
            try
            {
                IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
                sched.Start();
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }

        /// <summary>
        /// 关闭所有定时任务
        /// </summary>
        public static void ShutdownJobs()
        {
            try
            {
                IScheduler sched = (IScheduler)schedulerFactory.GetScheduler();
                if (!sched.IsShutdown)
                {
                    sched.Shutdown();
                }
            }
            catch (Exception e)
            {
                throw new Exception(e.Message);
            }
        }
        #endregion

    }
  1. 创建任务类:例
    public class MyJob : IJob
    {
        ILog logger = LogsHelper.GetCustomLogger("MyJob", "QSH");
        public void Execute(IJobExecutionContext context)
        {

            logger.Info("开始");
            logger.Info($"JobDetail的组和名字:{context.JobDetail.Key}");
            logger.Info("结束");

        }
    }
  1. 执行全部任务类
    public static class JobConfig
    {

        public static void JobContent()
        {
            var _jobStatus = System.Configuration.ConfigurationManager.AppSettings["JobStatus"];
            if (_jobStatus == "Y")
            {
                QuartzHelper.ExecuteIntervalMinutesTime<MyJob >(30,-1 );
            }
        }
    }
  1. 调用任务
JobConfig.JobContent();
 类似资料: