Quartz是一个任务调度

        这段时间做一个案子,用到每天定时处理事件,之前的解决思路是通过一个定时器轮询时间段,这样不能精准的在某个时间戳上执行动作。由于没有用过Quartz是一个任务调度,一直使用这个办法,今天通过同事提点,从此改变这种笨模式。

       1.基础知识

     Quartz任务调度的核心元素为:Scheduler——任务调度器、Trigger——触发器、Job——任务。其中trigger和job是任务调度的元数据,scheduler是实际执行调度的控制器。Trigger是用于定义调度时间的元素,即按照什么时间规则去执行任务。Quartz中主要提供了四种类型的trigger:SimpleTrigger,CronTirgger,DateIntervalTrigger,和NthIncludedDayTrigger。这四种trigger可以满足企业应用中的绝大部分需求。

      2.一直用的时间判断方法

      

            var nDateTime = DateTime.Now;
            var sDateTime = DateTime.Parse("08:00:00");
            var eDateTime = DateTime.Parse("20:00:00");
            if (sDateTime <= nDateTime && nDateTime <= eDateTime)
            {
                //Operation1
            }
            else
            {
                 //Operation2
            }

 

      3. 开始进入正题(Quartz时间调度)

          1.引用Quartz相关的dll组件(组件百度上自行下载)

      2.我在项目中封装了一个帮助类,便于调用    

 public  class TestJob 
        {
            private static IScheduler scheduler = null;
            public class OperateJob : IJob
            {
                public void Execute(IJobExecutionContext context)
                {
                    //定时需要操作的语句写在这就ok
                }
            }

        /// <summary>
        /// 初始化定时器
        /// </summary>
        /// <param name="type">0:每天,1:每周</param>
        /// <param name="weekday">星期几</param>
        /// <param name="hour">小时</param>
        /// <param name="minute">分钟</param>
        public static bool InitOperateTimer(int type, string weekday, int hour, int minute)
        {
            try
            {
               
                release(); //释放定时器             
                ISchedulerFactory factory = new StdSchedulerFactory(); //工厂

                if (scheduler == null)//启动
                scheduler = factory.GetScheduler();
                             
                scheduler.Start(); //启动
                IJobDetail job = JobBuilder.Create<OperateJob>().WithIdentity("Ipjob", "Ipjobs").Build();   //描述工作    
                ITrigger trigger = null; //触发器
                trigger = TriggerBuilder.Create().StartAt(DateTime.Now.AddSeconds(0)).WithCronSchedule("30 3 12 * * ? ").Build();//时间 12:03:30 触发Execute()

                //执行
                scheduler.ScheduleJob(job, trigger);
            }
            catch (Exception ex)
            {
                return false;
            }
            return true;
        }
        /// <summary>
        /// 释放
        /// </summary>
        public static void release()
        {
            if (scheduler != null && !scheduler.IsShutdown)
            {
                scheduler.Shutdown(true);
                scheduler = null;
            }
        }
    }
View Code

         trigger = TriggerBuilder.Create().StartAt(DateTime.Now.AddSeconds(0)).WithCronSchedule("30 3 12 * * ? ").Build();//时间 12:03:30 触发Execute()

         就可以在这里设置你需要执行的时间。QuartZ Corn表达式在这里罗列一下,也可以自行搜索。

    4.QuartZ Corn表达式

      Cron Expressions

     cron的表达式是字符串,实际上是由七子表达式,描述个别细节的时间表。

          *       *      *       *       *      *        *

          Seconds           Minutes           Hours           Day-of-Month           Month        Day-of-Week       Year (可选字段)

 

       1.Seconds (0~59)
       2.Minutes (0~59)
    3.Hours (0~23)
    4.Day-of-Month (1~31,但是要注意有些月份没有31天)
    5.Month (0~11,或者"JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV,DEC")
    6.Day-of-Week (1~7,1=SUN 或者"SUN, MON, TUE, WED, THU, FRI, SAT”)
    7.Year (1970~2099)

 

           1)Cron表达式的格式:秒 分 时 日 月 周 年(可选)。

               “*” 代表整个时间段

               “?”字符:表示不确定的值

               “,”字符:指定数个值

               “-”字符:指定一个值的范围

               “/”字符:指定一个值的增加幅度。n/m表示从n开始,每次增加m

               “L”字符:用在日表示一个月中的最后一天,用在周表示该月最后一个星期X

               “W”字符:指定离给定日期最近的工作日(周一到周五)

               “#”字符:表示该月第几个周X。6#3表示该月第3个周五

                2)Cron表达式范例:(网上的例子,我直接拿过来了)

                 每隔5秒执行一次:*/5 * * * * ?

                 每隔1分钟执行一次:0 */1 * * * ?

                 每天23点执行一次:0 0 23 * * ?

                 每天凌晨1点执行一次:0 0 1 * * ?

                 每月1号凌晨1点执行一次:0 0 1 1 * ?

                 每月最后一天23点执行一次:0 0 23 L * ?

                 每周星期天凌晨1点实行一次:0 0 1 ? * L

                 在26分、29分、33分执行一次:0 26,29,33 * * * ?

                 每天的0点、13点、18点、21点都执行一次:0 0 0,13,18,21 * * ?

 

 

posted @ 2019-03-21 13:07  清风绿茶  阅读(172)  评论(0编辑  收藏  举报