Cron 觸發器及相關內容 (第四部分)
七. Cron 表示式 Cookbook
此處的 Cron 表示式 cookbook 旨在為常用的執行需求提供方案。儘管不可能列舉出所有的表示式,但下面的應該為滿足你的業務需求提供了足夠的例子。
·分鐘的 Cron 表示式
表 5.1. 包括了分鐘頻度的任務計劃 Cron 表示式
用法
表示式
每天的從 5:00 PM 至 5:59 PM 中的每分鐘觸發
0 * 17 * * ?
每天的從 11:00 PM 至 11:55 PM 中的每五分鐘觸發
0 0/5 23 * * ?
每天的從 3:00 至 3:55 PM 和 6:00 PM 至 6:55 PM 之中的每五分鐘觸發
0 0/5 15,18 * * ?
每天的從 5:00 AM 至 5:05 AM 中的每分鐘觸發
0 0-5 5 * * ?
·日上的 Cron 表示式
表 5.2. 基於日的頻度上任務計劃的 Cron 表示式
用法
表示式
每天的 3:00 AM
0 0 3 * * ?
每天的 3:00 AM (另一種寫法)
0 0 3 ? * *
每天的 12:00 PM (中午)
0 0 12 * * ?
在 2005 中每天的 10:15 AM
0 15 10 * * ? 2005
·周和月的 Cron 表示式
表 5.3. 基於周和/或月的頻度上任務計劃的 Cron 表示式
用法
表示式
在每個週一,二, 三和週四的 10:15 AM
0 15 10 ? * MON-FRI
每月15號的 10:15 AM
0 15 10 15 * ?
每月最後一天的 10:15 AM
0 15 10 L * ?
每月最後一個週五的 10:15 AM
0 15 10 ? * 6L
在 2002, 2003, 2004, 和 2005 年中的每月最後一個週五的 10:15 AM
0 15 10 ? * 6L 2002-2005
每月第三個週五的 10:15 AM
0 15 10 ? * 6#3
每月從第一天算起每五天的 12:00 PM (中午)
0 0 12 1/5 * ?
每一個 11 月 11 號的 11:11 AM
0 11 11 11 11 ?
三月份每個週三的 2:10 PM 和 2:44 PM
0 10,44 14 ? 3 WED
八. 建立一個即刻觸發的 Trigger
有時候,你需要立即執行一個 job。例如,想像一下,你正在構建一個 GUI 程式並允許使用者能立刻執行。另一個例子,你或許已經檢測到了某個 Job 未執行成功,因此你想要即刻重跑一次。在 Quartz 1.5,有幾個方法被加入到了 TriggerUtils 類中,使得實現那些事很容易了。程式碼 5.4 展示瞭如何部署一個 job,只讓它立即執行一次。
程式碼 5.4. 你可以用 TriggerUtils 來立即執行一個 Job
- public class Listing_5_4 {
- static Log logger = LogFactory.getLog(Listing_5_4.class);
- public static void main(String[] args) {
- Listing_5_4 example = new Listing_5_4();
- example.runScheduler();
- }
- public void runScheduler() {
- Scheduler scheduler = null;
- try {
- // Create a default instance of the Scheduler
- scheduler = StdSchedulerFactory.getDefaultScheduler();
- scheduler.start();
- logger.info("Scheduler was started at " + new Date());
- // Create the JobDetail
- JobDetail jobDetail = new JobDetail("PrintInfoJob",
- Scheduler.DEFAULT_GROUP,
- PrintInfoJob.class);
- // Create a trigger that fires once right away
- Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 0);
- trigger.setName("FireOnceNowTrigger");
- scheduler.scheduleJob(jobDetail, trigger);
- } catch (SchedulerException ex) {
- logger.error(ex);
- }
- }
- }
public class Listing_5_4 { static Log logger = LogFactory.getLog(Listing_5_4.class); public static void main(String[] args) { Listing_5_4 example = new Listing_5_4(); example.runScheduler(); } public void runScheduler() { Scheduler scheduler = null; try { // Create a default instance of the Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); scheduler.start(); logger.info("Scheduler was started at " + new Date()); // Create the JobDetail JobDetail jobDetail = new JobDetail("PrintInfoJob", Scheduler.DEFAULT_GROUP, PrintInfoJob.class); // Create a trigger that fires once right away Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 0); trigger.setName("FireOnceNowTrigger"); scheduler.scheduleJob(jobDetail, trigger); } catch (SchedulerException ex) { logger.error(ex); } } }
在程式碼 5.4 中,TriggerUtils 的 makeImmediateTrigger() 方法被用來立即執行一個 Job。第一個引數是將要觸發的次數。第二個引數是執行的間隔時間。為方便起見,這個方法的簽名顯示如下:
public static Trigger makeImmediateTrigger(int repeatCount, long repeatInterval);
TriggerUtils 類提供了許多便利的方法簡化了 Trigger 的使用。確切地檢查一下這個工具類中看看是否有你想要的東西。你還將在本書上看到更多的使用 TriggerUtils 的例子。