Quartz之Trigger

先介绍一下Trigger的常用属性:

  • jobKey 标记了Trigger被触发的时候应该被调用的Job的id。
  • java.util.Date对象。
  • Trigger的调度不再生效的事件。
  • priority表示了Trigger的触发优先级,当资源不够用的时候有个原则是:事件考前的Trigger先被触发然后对于同一时间的优先级高的先被触发,默认的优先级是5。
  • misfire发生因为持久的触发器错过了它的触发事件,可能因为调度器正在被关闭或者因为
 下面介绍一下Quartz的Calendar 接口,不是java.util.Calendar。

[java]  view plain  copy
  1. package org.quartz;  
  2.   
  3. public interface Calendar {  
  4.   
  5.   public boolean isTimeIncluded(long timeStamp);  
  6.   
  7.   public long getNextIncludedTime(long timeStamp);  
  8.   
  9. }  
从接口定义中可以很容易看出 Calendar 是干什么的:

Quartz的Calendar对象可以和trigger关联在一起存储在调度器中。Calendar用于排除一些trigger应该被触发的时间。例如你定义了9:30但是你要排除节假日。

[java]  view plain  copy
  1. package domyself.dusk.quartz;  
  2.   
  3. import java.text.SimpleDateFormat;  
  4. import java.util.Calendar;  
  5. import java.util.Date;  
  6.   
  7. import org.quartz.JobBuilder;  
  8. import org.quartz.JobDetail;  
  9. import org.quartz.JobKey;  
  10. import org.quartz.Scheduler;  
  11. import org.quartz.SchedulerException;  
  12. import org.quartz.SchedulerFactory;  
  13. import org.quartz.SimpleScheduleBuilder;  
  14. import org.quartz.Trigger;  
  15. import org.quartz.TriggerBuilder;  
  16. import org.quartz.impl.StdSchedulerFactory;  
  17. import org.quartz.impl.calendar.HolidayCalendar;  
  18.   
  19. public class Client {  
  20.     public static void main(String[] args) throws SchedulerException {  
  21.         final String configFile = "domyself/dusk/quartz/quartz.properties";  
  22.         SchedulerFactory factory = new StdSchedulerFactory(configFile);  
  23.         Scheduler scheduler = factory.getScheduler();  
  24.         <strong>HolidayCalendar cal = new HolidayCalendar();  
  25.         scheduler.addCalendar("myHolidays", cal, false,false);</strong>  
  26.         // 10秒钟调用一下HelloJob,永远重复下去  
  27.         Trigger trigger = TriggerBuilder.newTrigger().startNow()  
  28.                 .withIdentity("hello")  
  29.                 .withPriority(6)  
  30.                 .modifiedByCalendar("myHolidays")  
  31.                 .withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(10))  
  32.                 .build();  
  33.   
  34.         JobDetail job = JobBuilder.newJob(DumbJob.class)  
  35.                 .withIdentity("myJob""group1")  
  36.                 // name "myJob", group "group1"  
  37.                 .usingJobData("jobSays""Hello World!")  
  38.                 .usingJobData("myFloatValue", 10f).build();  
  39.           
  40.         scheduler.scheduleJob(job, trigger);  
  41.         scheduler.start();  
  42.         // scheduler.shutdown(true);  
  43.     }  
  44. }  
任务不会被调用,因为今天是2016-6-19星期天,被HolidayCalendar排除了。

SimpleTrigger 

如果你的有一个job需要在一个特定的时间执行一次或者在给定的时间接下来需要以指定的间隔重复,SimpleTrigger 满足你的需求。
需要静态导入的:
[java]  view plain  copy
  1. import static org.quartz.TriggerBuilder.*;  
  2. import static org.quartz.SimpleScheduleBuilder.*;  
  3. import static org.quartz.DateBuilder.*:  
创建一个在指定事件触发不重复的Trigger:
[java]  view plain  copy
  1. SimpleTrigger trigger = (SimpleTrigger) newTrigger()  
  2.     .withIdentity("trigger1""group1")  
  3.     .startAt(myStartTime) // some Date  
  4.     .forJob("job1""group1"// identify job with name, group strings  
  5.     .build();  
创建一个在指定事件触发不重复的Trigger,每10秒重复一次重复10次:
[java]  view plain  copy
  1. trigger = newTrigger()  
  2.     .withIdentity("trigger3""group1")  
  3.     .startAt(myTimeToStartFiring)  // if a start time is not given (if this line were omitted), "now" is implied  
  4.     .withSchedule(simpleSchedule()  
  5.         .withIntervalInSeconds(10)  
  6.         .withRepeatCount(10)) // note that 10 repeats will give a total of 11 firings  
  7.     .forJob(myJob) // identify job with handle to its JobDetail itself                     
  8.     .build();  
创建一个Trigger,在接下来的5分钟后触发一次:
[java]  view plain  copy
  1. trigger = (SimpleTrigger) newTrigger()  
  2.   .withIdentity("trigger5""group1")  
  3.   .startAt(futureDate(5, IntervalUnit.MINUTE)) // use DateBuilder to create a date in the future  
  4.   .forJob(myJobKey) // identify job with its JobKey  
  5.   .build();  
创建一个立即触发的Trigger,每5分钟重复一次知道 22:00:
[java]  view plain  copy
  1. trigger = newTrigger()  
  2.    .withIdentity("trigger7""group1")  
  3.    .withSchedule(simpleSchedule()  
  4.        .withIntervalInMinutes(5)  
  5.        .repeatForever())  
  6.    .endAt(dateOf(2200))  
  7.    .build();  
创建一个Trigger在下一个小时触发,每隔2小时重复一次:
[java]  view plain  copy
  1. trigger = newTrigger()  
  2.   .withIdentity("trigger8"// because group is not specified, "trigger8" will be in the default group  
  3.   .startAt(evenHourDate(null)) // get the next even-hour (minutes and seconds zero ("00:00"))  
  4.   .withSchedule(simpleSchedule()  
  5.       .withIntervalInHours(2)  
  6.       .repeatForever())  
  7.   // note that in this example, 'forJob(..)' is not called  
  8.   //  - which is valid if the trigger is passed to the scheduler along with the job    
  9.   .build();  
  10.   
  11.   scheduler.scheduleJob(trigger, job);  
SimpleTrigger的 Misfire Instruction常量:
[java]  view plain  copy
  1. MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY  
  2. MISFIRE_INSTRUCTION_FIRE_NOW  
  3. MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_EXISTING_REPEAT_COUNT  
  4. MISFIRE_INSTRUCTION_RESCHEDULE_NOW_WITH_REMAINING_REPEAT_COUNT  
  5. MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_REMAINING_COUNT  
  6. MISFIRE_INSTRUCTION_RESCHEDULE_NEXT_WITH_EXISTING_COUNT  
使用例子:
[java]  view plain  copy
  1. trigger = newTrigger()  
  2.   .withIdentity("trigger7""group1")  
  3.   .withSchedule(simpleSchedule()  
  4.   .withIntervalInMinutes(5)  
  5.   .repeatForever()  
  6.   .withMisfireHandlingInstructionNextWithExistingCount())  
  7.   .build();  

CronTrigger

一个字,好使!
介绍下Corn表达式:
  1. Seconds
  2. Minutes
  3. Hours
  4. Day-of-Month
  5. Month
  6. Day-of-Week
  7. Year (可选)
Corn表达式由上面七部分组成,中间使用空格分隔开。
Corn表达式的通配字符:
Field Name Mandatory Allowed Values Allowed Special Characters
Seconds YES 0-59 , - * /
Minutes YES 0-59 , - * /
Hours YES 0-23 , - * /
Day of month YES 1-31 , - * ? / L W
Month YES 1-12 or JAN-DEC , - * /
Day of week YES 1-7 or SUN-SAT , - * ? / L #
Year NO empty, 1970-2099 , - * /
其中
  • * (“所有值”) - 例如, “*” 在分钟字段中表示每分钟。

  • ? (“没有指定值”) - 有用的,当你需要指定一些东西在两个字段中,其中一个字段中被允许,而另一个字段不被允许。例如:你想要我的Trigger在一个月中的特殊天(例如:第10天)被触发,但是不关心这天是周几,那么我将放10在day-of-month字段并且放“?”在day-of-week 字段。

  • - - 用于指定范围. 例如, “10-12” 在hour字段表示10,11,12点。

  • , - 用于指定附加的值。例如, “MON,WED,FRI” 在 day-of-week字段表示 “周一、周二和周五”.

  • / -用于指定增量.例如, “0/15”在 seconds字段表示  “0, 15, 30, 和45秒”.。 ‘1/3’ 在day-of-month 字段表示 “每隔三天触发一次从月初1号开始”。

  • L (“last”) - 在允许的两个字段中有不同的含义。例如, “L”在day-of-month字段表示“月的最后一天” - 1月的31号, 非瑞年的2月28号。如果用在 day-of-week 字段, 它仅仅表示“7” 或“SAT”。但是用在day-of-week 中的另一个值后面, 它表示 “这个月的倒数第 xxx 天”- 例如 “6L” 表示 “这个月的最后一个星期五”.。你也可以指定一个到这个月末的偏移量, 例如 “L-3” 表示这个月的倒数第三天。 当使用“L”选项时,最重要的是不要指定列表,或范围的值,否则你会得到一个令人困惑的或者说非期望的值。

  • W (“weekday”) - 用于指定一个最接近指定日期的工作日(周一到周五). 举个例子,如果你指定 “15W” 作为day-of-month 字段的值, t意思就是说: “离15号的最接近的工作日”。 如果15th 是星期六,Trigger将会在14号-周五被触发。如果15th是一个星期天,trigger 将在16号被触发。如果15号是周二,Trigger将在15号被触发.。然而如果你指定“1W” 作为 day-of-month的值, 并且1号是一个周六, trigger将在3号周一被触发,因为它不会跳过一个月的范围。  ‘W’ 字符可以被使用仅仅当 day-of-month是单独的一天, 不是一个范围或着列表。




一些简单有用的例子:
“0 0/5 * * * ?” 每隔5分钟触发一次
“10 0/5 * * * ?” 每隔5分钟执行一次,时间秒数是10,例如:10:00:10 和10:05:10等
“0 30 10-13 ? * WED,FRI” 周三周五的10:30、 11:30、12:30、13:30触发
“0 0/30 8-9 5,20 * ?” 每个月20号的8:00到9:00之间每隔30分钟触发一次

例子:
[java]  view plain  copy
  1. Trigger trigger = TriggerBuilder.newTrigger()  
  2.                 .withIdentity("trigger3""group1")  
  3.                 .withSchedule(CronScheduleBuilder.cronSchedule("0 0/2 8-17 * * ?"))  
  4.                 .forJob("myJob""group1")  
  5.                 .build();  

CronTrigger的 Misfire Instruction常量:
[java]  view plain  copy
  1. MISFIRE_INSTRUCTION_IGNORE_MISFIRE_POLICY  
  2. MISFIRE_INSTRUCTION_DO_NOTHING  
  3. MISFIRE_INSTRUCTION_FIRE_NOW  
用法:
[java]  view plain  copy
  1. trigger = newTrigger()  
  2.     .withIdentity("trigger3""group1")  
  3.     .withSchedule(cronSchedule("0 0/2 8-17 * * ?")  
  4.         ..withMisfireHandlingInstructionFireAndProceed())  
  5.     .forJob("myJob""group1")  
  6.     .build();  

猜你喜欢

转载自blog.csdn.net/qq_36838191/article/details/80479874
今日推荐