cron總結html
cron詳解參見:《quartz CronExpression表達式》java
CronTrigger配置完整格式爲7個: [秒] [分] [小時] [日] [月] [周] [年] ,通常爲6個,省去最後那個年。舉例:"0/20 * * * * ?" 每20秒執行一次,無限期重複express
序號 | 含義 | 默認 | 默認值含義 | 容許填寫的值 | 容許的通配符 | 通配符舉例 |
1 | 秒 | * | 每秒 | 0-59 | , - * / | 0/20 每20秒 |
2 | 分 | * | 每分 | 0-59 | , - * / | 10,20,30 第十、20、30分鐘 |
3 | 小時 | * | 每小時 | 0-23 | , - * / | 8-17 上午8點到下午17點 |
4 | 日 | * | 每日 | 1-31 | , - * ? / L W | 1,15 月的1號和15號函數 6L 表示這個月的倒數第6天ui "15W",表示離每個月15號最近的那個工做日觸發。若是15號正好是週六,則找最近的週五(14號)觸發, 若是15號是周未,則找最近的下週一(16號)觸發.若是15號正好在工做日(週一至週五),則就在該天觸發。 spa |
5 | 月 | * | 每個月 | 1-12 or JAN-DEC | , - * / | 2,4,6 2月4月和6月debug JAN-DEC 1月到12月code |
6 | 周 | ? | 每週 | 1-7 or SUN-SAT | , - * ? / L # | SUN-SAT 星期天到星期六 |
7 | 年 | 非必填 | 空 或 1970-2099 | , - * / |
任務類htm
1 package org.quartz.examples.example3; 2 3 import java.util.Date; 4 5 import org.slf4j.Logger; 6 import org.slf4j.LoggerFactory; 7 import org.quartz.Job; 8 import org.quartz.JobExecutionContext; 9 import org.quartz.JobExecutionException; 10 import org.quartz.JobKey; 11 12 /** 13 * 任務job 14 */ 15 public class SimpleJob implements Job { 16 17 private static Logger LOG = LoggerFactory.getLogger(SimpleJob.class); 18 19 // 必需要有public修飾的無參構造函數 20 public SimpleJob() { 21 } 22 23 // 任務執行方法 24 public void execute(JobExecutionContext context) throws JobExecutionException { 25 JobKey jobKey = context.getJobDetail().getKey(); //jobKey長這樣:group1.job6 26 LOG.info("執行任務。SimpleJob says: " + jobKey + " executing at " + new Date()); 27 } 28 29 }
調度管理類blog
1 package org.quartz.examples.example3; 2 3 import static org.quartz.CronScheduleBuilder.cronSchedule; 4 import static org.quartz.JobBuilder.newJob; 5 import static org.quartz.TriggerBuilder.newTrigger; 6 7 import org.quartz.CronTrigger; 8 import org.quartz.JobDetail; 9 import org.quartz.Scheduler; 10 import org.quartz.SchedulerFactory; 11 import org.quartz.SchedulerMetaData; 12 import org.quartz.impl.StdSchedulerFactory; 13 import org.slf4j.Logger; 14 import org.slf4j.LoggerFactory; 15 16 import java.util.Date; 17 18 /** 19 * 這個示例將演示使用Cron觸發器的Quartz的全部基本調度功能。 20 * 21 */ 22 public class CronTriggerExample { 23 Logger LOG = LoggerFactory.getLogger(CronTriggerExample.class); 24 25 /* 26 * 如下用到的cron總結: "0/20 * * * * ?" 每20秒執行一次 27 */ 28 public void run() throws Exception { 29 // 初始化一個調度工廠,並實例化一個調度類 30 SchedulerFactory sf = new StdSchedulerFactory(); 31 Scheduler sched = sf.getScheduler(); 32 33 JobDetail job = null; 34 CronTrigger trigger = null; 35 Date ft = null; 36 37 // ======================================================== 38 // ============ job1 每20秒執行一次,無限期重複 39 // ======================================================== 40 job = newJob(SimpleJob.class).withIdentity("job1", "group1").build(); 41 trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0/20 * * * * ?")).build(); 42 ft = sched.scheduleJob(job, trigger); 43 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 44 + trigger.getCronExpression()); 45 46 // ======================================================== 47 // ============ job2 將每隔2分鐘運行一次(每分鐘事後15秒) 48 // ======================================================== 49 job = newJob(SimpleJob.class).withIdentity("job2", "group1").build(); 50 trigger = newTrigger().withIdentity("trigger2", "group1").withSchedule(cronSchedule("15 0/2 * * * ?")).build(); 51 ft = sched.scheduleJob(job, trigger); 52 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 53 + trigger.getCronExpression()); 54 55 // ======================================================== 56 // ============ job3 將每隔一分鐘運行一次,但只在上午8點到下午5點之間才運行 57 // ======================================================== 58 job = newJob(SimpleJob.class).withIdentity("job3", "group1").build(); 59 trigger = newTrigger().withIdentity("trigger3", "group1").withSchedule(cronSchedule("0 0/1 8-17 * * ?")) 60 .build(); 61 ft = sched.scheduleJob(job, trigger); 62 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 63 + trigger.getCronExpression()); 64 65 // ======================================================== 66 // ============ job4 每三分鐘運行一次,但只在下午5點到11點之間運行 67 // ======================================================== 68 job = newJob(SimpleJob.class).withIdentity("job4", "group1").build(); 69 trigger = newTrigger().withIdentity("trigger4", "group1").withSchedule(cronSchedule("0 0/3 17-23 * * ?")) 70 .build(); 71 ft = sched.scheduleJob(job, trigger); 72 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 73 + trigger.getCronExpression()); 74 75 // ======================================================== 76 // ============ job5將在每個月的第1天和第15天上午10點運行 77 // ======================================================== 78 job = newJob(SimpleJob.class).withIdentity("job5", "group1").build(); 79 trigger = newTrigger().withIdentity("trigger5", "group1").withSchedule(cronSchedule("0 0 10am 1,15 * ?")) 80 .build(); 81 ft = sched.scheduleJob(job, trigger); 82 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 83 + trigger.getCronExpression()); 84 85 // ======================================================== 86 // ============ job6 將每30秒運行一次,但僅限於工做日(週一至週五) 87 // ======================================================== 88 // job 6 will run every 30 seconds but only on Weekdays (Monday through Friday) 89 job = newJob(SimpleJob.class).withIdentity("job6", "group1").build(); 90 trigger = newTrigger().withIdentity("trigger6", "group1").withSchedule(cronSchedule("0,30 * * ? * MON-FRI")) 91 .build(); 92 ft = sched.scheduleJob(job, trigger); 93 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 94 + trigger.getCronExpression()); 95 96 // ======================================================== 97 // ============ job7 每30秒運行一次,但只在週末(週六和週日) 98 // ======================================================== 99 job = newJob(SimpleJob.class).withIdentity("job7", "group1").build(); 100 trigger = newTrigger().withIdentity("trigger7", "group1").withSchedule(cronSchedule("0,30 * * ? * SAT,SUN")) 101 .build(); 102 ft = sched.scheduleJob(job, trigger); 103 LOG.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: " 104 + trigger.getCronExpression()); 105 106 // ==================================================================== 107 // ============ 啓動調度器 108 // ==================================================================== 109 sched.start(); 110 111 try { 112 Thread.sleep(300L * 1000L); // 等待5分鐘 113 } catch (Exception e) { 114 } 115
/**
* 終止調度。
* 可是若是當前仍然有任務正在運行中,則會等待該任務執行完畢再終止,期間debug信息會打印:
* 21:48:54.965 [main] DEBUG org.quartz.simpl.SimpleThreadPool - Waiting for thread TestScheduler_Worker-1 to shut down
*/
116 sched.shutdown(true); 117 // 顯示調度器的一些統計信息 118 SchedulerMetaData metaData = sched.getMetaData(); 119 LOG.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs."); 120 } 121 122 public static void main(String[] args) throws Exception { 123 CronTriggerExample example = new CronTriggerExample(); 124 example.run(); 125 } 126 127 }