zoukankan      html  css  js  c++  java
  • Quartz.NET开源作业调度框架系列(二):CronTrigger

      CronTriggers比SimpleTrigger更加的灵活和有用,对于比较复杂的任务触发规则,例如"每个星期天的晚上12:00"进行备份任务,SimpleTrigger就不能胜任,只能选择CronTriggers.利用CronTrigger, 你不但能实现在"每个星期天的晚上12:00"进行备份的任务,还可以执行  "在每个星期一/星期三/星期五的上午9:00到10:00期间每隔5 分钟"进行某个自动化任务.

    1 Cron Expressions

      Cron-Expressions 是用户配置实例化的CronTrigger. Cron-Expressions是一个6个或者7个字符的字符串表达式, 每一个字符都表示一个具体的含义并且有取值范围. 每个字符用空格进行分隔,其表达的意义为(从左到右):

      

      一般来说Cron-Expressions 以6位居多,年一般省略.上图的中每个字符的描述为 字符的意义+取值范围(用[])+可用的特殊字符({}).例如  秒[0-59] { , - * /}就代表第一个字符是秒,取值范围是0-59,同时可用的特殊字符为 , - * /  例如"0  15  10 ?  *  6L"代表的意义就是每月最后一个星期五的10:15. 下面介绍一下特殊字符的含义:

    特殊字符

    含义

    *

    所有值(all values)

    ?

    没有具体的值(no specific value)

    -

    范围 0-10

    ,

    附加值 1,2,5

    L

    在不同的字符位置代表的意义不同,"L" 在月天数段代表每月最后一天;如果单独出现在星期段,代表7,就是星期最后一天周六(英文习惯用法).

    W

    给定日期最近的(周一到周五). 月天数段"15W",表示离每月第15天最近的工作日

    #

    月份的第多少天,"6#3" 表示月份中第三个星期5(6 = 周五 and "#3" =在月份中第三个).

    2 常见的表达式

       下面给出一些常见的Cron-Expressions示例:

    表达式

    含义

    0 0 12 * * ?

    每天12pm启动

    0 15 10 ? * *

    每天10:15am启动

    0 15 10 * * ?

    每天10:15am启动

    0 15 10 * * ? *

    每天10:15am启动

    0 15 10 * * ? 2005

     在 2005年每天10:15am启动

    0 * 14 * * ?

    每天在 2pm到2:59pm之间的每分钟进行启动

    0 0/5 14 * * ?

    每天在 2pm到2:55pm之间的每5分钟进行启动

    0 0/5 14,18 * * ?

    每天在 2pm到2:55pm和6pm到6:55pm之间的每5分钟进行启动

    0 0-5 14 * * ?

    每天在 2pm到2:05pm之间的每分钟进行启动

    0 10,44 14 ? 3 WED

    每个三月份的星期三的2:10pm到 2:44pm进行启动

    0 15 10 ? * MON-FRI

    每个星期一到星期五的10:15am进行启动

    0 15 10 15 * ?

    每个月第15天的10:15am进行启动

    0 15 10 L * ?

    每个月最后一天的10:15am进行启动

    0 15 10 L-2 * ?

    每个月第二天到最后一天的10:15am进行启动

    0 15 10 ? * 6L

    每月最后一个星期五的10:15am进行启动

    0/1 * * * * ?

    每秒进行启动

    0 15 10 ? * 6L 2002-2005

    从2002年到2005年的每月最后一个星期五的10:15am进行启动

    0 15 10 ? * 6#3

    每月第三个星期五的10:15am进行启动

    0 0 12 1/5 * ?

    从每月第一天开始,每隔5天的12pm进行启动

    0 11 11 11 11 ?

    每年11月11日的11:11am进行启动 

    3 CronTrigger示例

      由上面的常见表达式我们知道表达式 "0/1 * * * * ?"代表了每秒执行 , 其CronTrigger定义如下:

    1                 ITrigger trigger = TriggerBuilder.Create()
    2                .WithIdentity("cronTrigger1", "SimpleGroup")
    3                .WithCronSchedule("0/1 * * * * ?", x => x
    4                    .WithMisfireHandlingInstructionFireAndProceed())
    5                .ForJob("HelloJob", "SimpleGroup")
    6                .Build();

       也可以用下面的方法进行定义(注意默认时间不是系统时间-北京时间,所以如果打印出Job第一次打印的时间不是正确的时间,但是好像不影响使用):

     1 //定义job
     2 IJobDetail job3 = JobBuilder.Create<ColorJob>()
     3 .WithIdentity("job3", "group1")
     4 .Build();
     5 //定义cronTrigger
     6 ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
     7                              .WithIdentity("cronTrigger", "group1")
     8                               .WithCronSchedule("0/20 * * * * ?", x => x
     9                                         .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?
    10                              .Build();
    11 //默认开始时间
    12 DateTimeOffset scheduleTime3 = sched.ScheduleJob(job3, cronTrigger);
    13 //转换到本地时间(北京时间)
    14 DateTimeOffset dt=  scheduleTime3.ToLocalTime();//
    15 //北京时间为默认时间+8小时
    16 DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours(8);
    17 //返回Cron Expression
    18 string cronExpression = cronTrigger.CronExpressionString;

        如果在定义的时间规则下,我想排除一些日期,那么如何实现呢?用ModifiedByCalendar即可实现:

     1         //排除的日期
     2            HolidayCalendar cal = new HolidayCalendar();
     3            DateTime dt排除 = new DateTime(2015, 12, 1);
     4            cal.AddExcludedDate(dt排除);
     5 
     6            sched.AddCalendar("myHolidayCalendar", cal, false, true);
     7             //定义job
     8            IJobDetail job3 = JobBuilder.Create<ColorJob>()
     9             .WithIdentity("job3", "group1")
    10             .Build();
    11            //定义cronTrigger
    12            ICronTrigger cronTrigger = (ICronTrigger)TriggerBuilder.Create()
    13                                          .WithIdentity("cronTrigger", "group1")
    14                                           .WithCronSchedule("0/20 * * * * ?", x => x
    15                                                     .InTimeZone(TimeZoneInfo.FindSystemTimeZoneById("China Standard Time")))//无效 ?
    16                                          .ModifiedByCalendar("myHolidayCalendar")
    17                                          .Build();
    18            //默认开始时间
    19            DateTimeOffset scheduleTime3 = sched.ScheduleJob(job3, cronTrigger);
    20             //转换到本地时间(北京时间)
    21            //  2015-12-02 00:00:00 +08:00 不包含 2015-12-01
    22            DateTimeOffset dt = scheduleTime3.ToLocalTime();
    23             //北京时间为默认时间+8小时
    24            DateTimeOffset scheduleTimeChina = scheduleTime3.AddHours(8);
    25            //返回Cron Expression
    26            string cronExpression = cronTrigger.CronExpressionString;

     

  • 相关阅读:
    java环境配置为1.7jdk为什么cmd java -version查看版本是1.8
    bulid path 引 jar包 步骤
    eclipse 报错
    PLSQL使用技巧
    Oracle sqlplus不是内部或外部命令
    SVN 插件安装到Myeclipse10 上(经典)
    socket学习
    Eclipse 配置 插件svn 包步骤
    如何在Eclipse中使用SVN(经典)
    linux 下搭建LAMP
  • 原文地址:https://www.cnblogs.com/isaboy/p/Quartz_NET_Cron_Trigger_cron_expression.html
Copyright © 2011-2022 走看看