zoukankan      html  css  js  c++  java
  • 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 * * ?

     

  • 相关阅读:
    洛谷:P3391 【模板】文艺平衡树(Splay)
    洛谷:P2234 [HNOI2002]营业额统计
    洛谷冬令营随想
    存储过程分页说明
    前台数据验证(1)
    前台数据验证(2)
    【转载】JQuery中$.ajax()方法参数详解
    启用IIS的Gzip压缩
    使用WCF常见问题
    在使用WCF时如何生成证书认证?
  • 原文地址:https://www.cnblogs.com/TechnologyDictionary/p/10570999.html
Copyright © 2011-2022 走看看