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;

     

  • 相关阅读:
    使用golang访问kubebernetes
    使用 Rancher 管理现有 Kubernetes 集群
    Running powershell scripts during nuget package installation and removal
    How to Create, Use, and Debug .NET application Crash Dumps in 2019
    寻找写代码感觉(一)之使用 Spring Boot 快速搭建项目
    Selenium+Java之解决org.openqa.selenium.InvalidArgumentException: invalid argument报错问题
    Selenium环境搭建
    关于Xpath定位方法知道这些基本够用
    Web自动化之浏览器启动
    【翻译】编写代码注释的最佳实践
  • 原文地址:https://www.cnblogs.com/isaboy/p/Quartz_NET_Cron_Trigger_cron_expression.html
Copyright © 2011-2022 走看看