美文网首页
动态添加定时器Quartz

动态添加定时器Quartz

作者: 飞天猪Pony | 来源:发表于2020-06-12 15:37 被阅读0次

调用定时器,比如说对不同的视频创建一个定时器。VideoID:视频ID

/// <summary>
/// 为某一个视频添加定时通知任务
/// </summary>
private static void QuartzLive(int VideoID)
{
      //在某个时间点内执行
      string timestr = DateTime.Now.AddSeconds(30).ToString("yyyy-MM-dd HH:mm:ss");
      //将时间转为Cron
      string cron = TimeToCron.TimeToQuartzCron(timestr);
      string ID = VideoID.ToString();
      QuartzConfigHelper.StartJob(ID, typeof(QuartzVideoStartLive), ID, cron );
}

定时器Helper类

public class QuartzConfigHelper
    {

        private static ISchedulerFactory sf = new StdSchedulerFactory();    //创建一个调度器工厂
        private static String JOB_GROUP_NAME = "QuartzJobGroupName";
        private static String TRIGGER_GROUP_NAME = "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);
            }
        }
        #endregion
    }

将时间转为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;
            }
        }
    }

相关文章

  • JAVA实现定时任务的几种方式

    JAVA实现定时任务的几种方式 @(JAVA)[spring|quartz|定时器]近期项目开发中需要动态的添加定...

  • 动态添加定时器Quartz

    调用定时器,比如说对不同的视频创建一个定时器。VideoID:视频ID 定时器Helper类 将时间转为Cron

  • SpringCloud 整合 Quartz 支持集群,支持动态修

    SpringCloud 整合 Quartz 支持集群,支持动态修改 Quartz 执行时间 一、添加 maven ...

  • Quartz定时器

    Quartz定时器的学习总结_给的再多~不如懂我-CSDN博客_quartz定时器 Quartz定时器 官方文档翻...

  • SSM员工考勤系统五

    转自http://coder520.com/添加定时器Quartz学习1、加入pom配置2、创建配置文件sprin...

  • Spring+Quartz 实现手动开关定时器

    在之前已经讲解了如果配置静态的quartz定时器(传送门:quartz定时器 ),不知道 各位小伙伴有没有成功呢,...

  • springQuartz定时器

    版本springframework:4.2.2.RELEASE;quartz:2.2.2.参见 定时器。 1、依赖...

  • CAGradientLayer与mask的使用

    1、给视图添加一个颜色渐变的动态背景 给视图添加一个CAGradientLayer层,然后通过定时器修改gradi...

  • MK-商品上下架方案细化

    设置quartz定时器,每秒遍历数据库(可以考虑时延减轻负担),每秒遍历DB。 首先明确 quartz job工作...

  • Quartz源码阅读

    前言 Quartz是Java实现的定时器框架,该文章分析Quartz执行原理,没有涉及用法。调试中使用到多线程调试...

网友评论

      本文标题:动态添加定时器Quartz

      本文链接:https://www.haomeiwen.com/subject/mqzgtktx.html