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 + " 執行了 ");
}
}
在這裏 對輸出 的日期進行了一小下 格式化,適應國人習慣.
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);