簡單回顧一下上一節學習到的 "HelloWorld "
1 創建一個job類,實現Job接口,覆蓋 public void execute(JobExecutionContext context) 方法,在方法中寫入你要執行的操作(數據導入/備份,輪詢檢查文件等)代碼
2 創建一個主線程類, 獲得 Scheduler 對象
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler sched = sf.getScheduler();
獲得要執行的對象 JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
定義觸發器 Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
將任務和Trigger放入scheduler :
sched.scheduleJob(job, trigger);
啓動 和 停止
sched.start(); sched.shutdown(true);
注意 給job 留有足夠長的時間,如果主線程類停止工作,job線程也會停止工作
------------------------------------------------我是分割線--------------------------------------------------------
經過了 "HelloWorld" 之後,您老人家可能對 Quartz 有所瞭解,下面讓我們繼續深入,學習下Quartz 重複執行任務該怎麼做
簡單的說就是 觸發器(Trigger)的參數設置. 什麼? 觸發器(Trigger)不知道是什麼?
出門左轉 <<作業調度框架 Quartz 學習筆記(一)>> 不謝
還是老套路,一個job 類,一個主線程類
SimpleJob.java
- public class SimpleJob implements Job {
- @Override
- public void execute(JobExecutionContext context)
- throws JobExecutionException {
- // job 的名字
- String jobName = context.getJobDetail().getKey().getName();
- // 任務執行的時間
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒");
- String jobRunTime = dateFormat.format(Calendar.getInstance().getTime());
- // 輸出任務執行情況
- System.out.println("任務 : " + jobName + " 在 " +jobRunTime + " 執行了 ");
- }
- }
在這裏 對輸出 的日期進行了一小下 格式化,適應國人習慣.
其它沒什麼好說的 0.0
SimpleTriggerExample.java
- import static org.quartz.DateBuilder.futureDate;
- import static org.quartz.JobBuilder.newJob;
- import static org.quartz.JobKey.jobKey;
- import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
- import static org.quartz.TriggerBuilder.newTrigger;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import org.quartz.DateBuilder;
- import org.quartz.DateBuilder.IntervalUnit;
- import org.quartz.JobDetail;
- import org.quartz.Scheduler;
- import org.quartz.SchedulerFactory;
- import org.quartz.SchedulerMetaData;
- import org.quartz.SimpleTrigger;
- import org.quartz.impl.StdSchedulerFactory;
- /**
- * Simple Triggers (簡單觸發器) 的使用.
- */
- public class SimpleTriggerExample {
- public static void main(String[] args) throws Exception {
- SimpleTriggerExample example = new SimpleTriggerExample();
- example.run();
- }
- public void run() throws Exception {
- // 日期格式化
- SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy 年 MM 月 dd 日 HH 時 mm 分 ss 秒");
- SchedulerFactory sf = new StdSchedulerFactory();
- Scheduler sched = sf.getScheduler();
- System.out.println("--------------- 初始化 -------------------");
- // 下一個第15秒 例:
- // 當前 10秒,則 執行時間爲15秒
- // 當前 16秒,則 執行時間爲30秒
- // 當前 33秒,則 執行時間爲45秒
- // 當前 48秒,則 執行時間爲00秒
- Date startTime = DateBuilder.nextGivenSecondDate(null, 15);
- // job1 將只會執行一次
- JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();
- SimpleTrigger trigger = (SimpleTrigger) newTrigger()
- .withIdentity("trigger1", "group1")
- .startAt(startTime).build();
- // 把job1 和 trigger加入計劃 . ft:此任務要執行的時間
- Date ft = sched.scheduleJob(job, trigger);
- System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // job2 將只會和執行一次(和job1一樣一樣的,吼~~)
- job = newJob(SimpleJob.class).withIdentity("job2", "group1").build();
- trigger = (SimpleTrigger) newTrigger()
- .withIdentity("trigger2", "group1").startAt(startTime).build();
- ft = sched.scheduleJob(job, trigger);
- System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // job3 將執行11次(執行1次,重複10次) ,每10秒重複一次
- job = newJob(SimpleJob.class).withIdentity("job3", "group1").build();
- trigger = newTrigger()
- .withIdentity("trigger3", "group1")
- .startAt(startTime)
- .withSchedule(
- simpleSchedule()
- .withIntervalInSeconds(10)// 重複間隔
- .withRepeatCount(10)) // 重複次數
- .build();
- ft = sched.scheduleJob(job, trigger);
- System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // trigger3 改變了. 每隔10s重複.共重複2次
- // 此處說明 , 上面job3已經 設定了 trigger3 重複10次,每次10s
- // 在這裏又改變了 trigger3的設置,不會對以前構成影響,而是當做一個新的來處理
- trigger = newTrigger()
- .withIdentity("trigger3", "group2")
- .startAt(startTime)
- .withSchedule(
- simpleSchedule()
- .withIntervalInSeconds(10)
- .withRepeatCount(2))
- .forJob(job).build();
- ft = sched.scheduleJob(trigger);
- System.out.println(job.getKey().getName() + " 改變過trigger3屬性的job3 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // job5 將在5分鐘後運行一次
- job = newJob(SimpleJob.class).withIdentity("job5", "group1").build();
- trigger = (SimpleTrigger) newTrigger()
- .withIdentity("trigger5", "group1")
- .startAt(futureDate(5, IntervalUnit.MINUTE)) // 設定5分鐘後運行
- .build();
- ft = sched.scheduleJob(job, trigger);
- System.out.println(job.getKey().getName()+ " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // job6 每40s運行一次,沒有指定重複次數,則無下限的重複
- job = newJob(SimpleJob.class).withIdentity("job6", "group1").build();
- trigger = newTrigger()
- .withIdentity("trigger6", "group1")
- .startAt(startTime)
- .withSchedule(
- simpleSchedule().withIntervalInSeconds(40)
- .repeatForever()).build();
- ft = sched.scheduleJob(job, trigger);
- System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // 所有的任務都被加入到了 scheduler中 ,但只有 schedulers.start(); 時纔開始執行
- sched.start();
- System.out.println("------- 開始調度 (調用.start()方法) ----------------");
- System.out.println("-------系統 啓動 的 時間 :" + dateFormat.format(new Date()));
- // 在 scheduled.start(); 之後,還可以將 jobs 添加到執行計劃中
- // job7 將重複20次 ,每5分鐘重複一次
- job = newJob(SimpleJob.class).withIdentity("job7", "group1").build();
- trigger = newTrigger()
- .withIdentity("trigger7", "group1")
- .startAt(startTime)
- .withSchedule(
- simpleSchedule()
- .withIntervalInMinutes(5) // 5分鐘
- .withRepeatCount(20)) // 重複20次
- .build();
- ft = sched.scheduleJob(job, trigger);
- System.out.println(job.getKey().getName() + " 將在 : " + dateFormat.format(ft) + " 時運行.並且重複: "
- + trigger.getRepeatCount() + " 次, 每次間隔 "
- + trigger.getRepeatInterval() / 1000 + " 秒");
- // job8 可以立即執行. 無trigger註冊
- job = newJob(SimpleJob.class).withIdentity("job8", "group1")
- .storeDurably().build();
- sched.addJob(job, true);
- System.out.println("手動觸發 job8...(立即執行)");
- sched.triggerJob(jobKey("job8", "group1"));
- System.out.println("------- 等待30 秒... --------------");
- try {
- Thread.sleep(30L * 1000L);
- } catch (Exception e) { }
- // job7 將馬上執行,重複10次,每秒一次
- System.out.println("------- 重新安排 ... --------------------");
- trigger = newTrigger()
- .withIdentity("trigger7", "group1")
- .startAt(startTime)
- .withSchedule(
- simpleSchedule().withIntervalInMinutes(5)
- .withRepeatCount(20)).build();
- ft = sched.rescheduleJob(trigger.getKey(), trigger);
- System.out.println("job7 被重新安排 在 : " + dateFormat.format(ft) +" 執行. \r 當前時間 :" + dateFormat.format(new Date())+"預定執行時間已過,任務立即執行");
- try {
- System.out.println("------- 等待5分鐘 ... ------------");
- Thread.sleep(300L * 1000L);
- } catch (Exception e) { }
- sched.shutdown(true);
- System.out.println("------- 調度已關閉 ---------------------");
- // 顯示一下 已經執行的任務信息
- SchedulerMetaData metaData = sched.getMetaData();
- System.out.println("~~~~~~~~~~ 執行了 " + metaData.getNumberOfJobsExecuted() + " 個 jobs.");
- }
- }
幾點說明:
1 DateBuilder.nextGivenSecondDate 的意思代碼中已經說明了,就是下一個你想要的時間,不懂的可以自己測試一下
2 同一個任務可以多次註冊.
3 重複執行 需要設置
trigger = newTrigger()
.withIdentity("trigger3", "group1")
.startAt(startTime)
.withSchedule(
simpleSchedule()
.withIntervalInSeconds(10)// 重複間隔
.withRepeatCount(10)) // 重複次數
.build();
如果需要一直重複:
trigger = newTrigger()
.withIdentity("trigger6", "group1")
.startAt(startTime)
.withSchedule(
simpleSchedule().withIntervalInSeconds(40)
.repeatForever()).build();
4 無trigger註冊,表示任務立即執行 : sched.addJob(job, true);
5 // 在scheduler.start之後調用,可以在job開始後重新定義trigger,然後重新註冊
sched.rescheduleJob(trigger.getKey(), trigger);
這個Example 還是比較簡單的,主要 就是Trigger的參數設置,多看看代碼,裏面有註釋的 0.0