quartz2.3.0(三)cron定義調度周期


cron總結

cron詳解參見:《quartz CronExpression表達式

CronTrigger配置完整格式為7個: [秒]   [分]   [小時]   [日]   [月]   [周]   [年]   ,一般為6個,省去最后那個年。舉例:"0/20 * * * * ?"    每20秒執行一次,無限期重復

序號 含義 默認 默認值含義 允許填寫的值 允許的通配符  通配符舉例
1 * 每秒 0-59 , - * / 0/20 每20秒
2 * 每分 0-59 , - * /  10,20,30 第10、20、30分鍾
3 小時 * 每小時 0-23 , - * /  8-17 上午8點到下午17點
4 * 每日 1-31 , - * ? / L W

 1,15 月的1號和15號

6L 表示這個月的倒數第6天

"15W",表示離每月15號最近的那個工作日觸發。如果15號正好是周六,則找最近的周五(14號)觸發, 如果15號是周未,則找最近的下周一(16號)觸發.如果15號正好在工作日(周一至周五),則就在該天觸發。  

5 * 每月 1-12 or JAN-DEC , - * /

 2,4,6  2月4月和6月

JAN-DEC  1月到12月

6 每周 1-7 or SUN-SAT , - * ? / L #  SUN-SAT  星期天到星期六
7 非必填   空 或 1970-2099 , - * /  

 

 

任務類

 

 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 }

 

 

調度管理類

  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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM