quartz是一個開源的作業調度框架,當然,java可以使用Timer來實現簡單任務調度的功能,但Timer是單線程的設計方案,使得一個任務延遲會影響到其他的任務。java也可以使用
ScheduledExecutor+
Calendar 使用復雜的調度功能,但是這會相應的增加復雜度,例如計算一個精確到天的時間便要使用時間組合來計算。
quartz與java本身的任務調度相比可以滿足更加復雜的任務調度需求,quartz提供了一個Job、Tigger和
Scheduler設計。
作業部分:
一個要被quartz框架調度的作業要實現了Job接口。
一個最簡單的Job實現如下:
package cn.edu.gdut.quartz; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloQuartz implements Job { public void execute(JobExecutionContext arg0) throws JobExecutionException { System.out.println("job test"); } }
當然,上面的實現部分可以實現不同的業務,可以在JobExecutionContext 中傳遞參數,也可以通過JobExecutionContext 來獲取一些關於作業調度的一些信息。
定義了相應的Job后,我們就可以將Job加入到一個JobDetail實例中了,Job完成相應業務的工作,JobDetail則保持了與此Job相關的一些信息,例如Job實例名稱,分組,描述,監聽器,數據,是否是有狀態的等待。
觸發器部分:
Tigger部分,quartz提供了4個實現和
TriggerUtils工具類,滿足不同的Tigger要求。以
CronTrigger為例,CronTrigger提供了幾個不同的構造方法,可以傳入時間、Job的信息和
cron表達式等,
關於Cron表達式可以猛戳連接
http://biaoming.iteye.com/blog/39532
//每5秒調度一次
String cronExpression="*/5 * * * * ?"; Trigger trigger=new CronTrigger("cronTrigger",Scheduler.DEFAULT_GROUP,cronExpression);
一個簡單的觸發器就完成了,當然,可以選擇更加豐富的日期選項來實現更豐富的觸發時間點。
TriggerUtils工具類也可以完成此任務,用它可以很方便生產一些Trigger
Trigger trigger = TriggerUtils.makeSecondlyTrigger(5); trigger.setName("cronTrigger"); trigger.setStartTime(new Date());
以上是一個簡單的觸發器。
調度器部分:
與TriggerUtils類似quartz提供了一個調度器工廠來獲取調度器,獲取到一個調度器后,我們只有JobDetail和Trigger交給調度器就好了
SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); // 對JobDetail和Trigger實例注冊到Schedule實例中 scheduler.scheduleJob(jobDetail, trigger); // 啟動調度器 scheduler.start(); try { // 當前線程等待20秒 Thread.sleep(20L * 1000L); } catch (Exception e) { e.printStackTrace(); } // 關閉調度器 scheduler.shutdown(true);
一個作業的調度器完成了。
至於要怎樣調度,那就交給quartz吧。