1.簡介:
Quartz是OpenSymphony開源組織在Job scheduling領域又一個開源項目,它可以與J2EE與J2SE應用程序相結合也可以單獨使用。Quartz可以用來創建簡單或爲運行十個,百個,甚至是好幾萬個Jobs這樣複雜的程序。Jobs可以做成標準的Java組件或 EJBs。Quartz的最新版本爲Quartz 2.2.3。
2.使用場景:
網頁遊戲中掛機自動修煉如8個小時,人物相關數值進行成長,當使用某道具後,時間減少到4個小時,人物對應獲得成長值.這其中就涉及到了Scheduler的操作,定時對人物進行更新屬性操作,更改定時任務執行時間.
2).
企業中如每天凌晨2點觸發數據同步、發送Email等操作
3.相關資料
官網:http://www.quartz-scheduler.org/
下載jar:http://www.quartz-scheduler.org/downloads
maven pom:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
4.架構的核心分析
1).SchedulerFactory -- 調度程序工廠
- StdSchedulerFactory -- Quartz默認的SchedulerFactory
- DirectSchedulerFactory -- DirectSchedulerFactory是對SchedulerFactory的直接實現,通過它可以直接構建Scheduler、threadpool 等
- ThreadExecutor / DefaultThreadExecutor -- 內部線程操作對象
- ThreadExecutor / DefaultThreadExecutor -- 內部線程操作對象
2).JobExecutionContext -- JOB上下文,保存着Trigger、 JobDeaitl 等信息,JOB的execute方法傳遞的參數就是對象的實例
- JobExecutionContextImpl
- StdScheduler -- Quartz默認的Scheduler
- RemoteScheduler -- 帶有RMI功能的Scheduler
- JobDetail -- 他是實現輪詢的一個的回調類,可將參數封裝成JobDataMap對象,Quartz將任務的作業狀態保存在JobDetail中.
- JobDataMap -- JobDataMap用來報錯由JobDetail傳遞過來的任務實例對象
- SimpleTrigger <普通的Trigger> -- SimpleScheduleBuilder
- CronTrigger <帶Cron Like 表達式的Trigger> -- CronScheduleBuilder
- CalendarIntervalTrigger <帶日期觸發的Trigger> -- CalendarIntervalScheduleBuilder
- DailyTimeIntervalTrigger <按天觸發的Trigger> -- DailyTimeIntervalScheduleBuilder
- SimpleThreadPool --一個Quartz默認實現的簡單線程池,它足夠健壯,能夠應對大部分常用場景
// 1、工廠模式 構建Scheduler的Factory,其中STD爲Quartz默認的Factory
// 開發者亦可自行實現自己的Factory;Job、Trigger等組件
SchedulerFactory sf = new StdSchedulerFactory();
// 2、通過SchedulerFactory構建Scheduler對象
Scheduler sched = sf.getScheduler();
// 3、org.quartz.DateBuilder.evenMinuteDate -- 通過DateBuilder構建Date
Date runTime = evenMinuteDate( new Date());
// 4、org.quartz.JobBuilder.newJob <下一分鐘> --通過JobBuilder構建Job
JobDetail job = newJob(HelloJob.class).withIdentity("job1","group1").build();
// 5、通過TriggerBuilder進行構建Trigger
Trigger trigger = newTrigger().withIdentity("trigger1","group1")
.startAt(runTime).build();
// 6、工廠模式,組裝各個組件<JOB,Trigger>
sched.scheduleJob (job, trigger);
// 7、start
sched.start();
try {
Thread.sleep(65L * 1000L);
} catch (Exception e) {
}
// 8、通過Scheduler銷燬內置的Trigger和Job
sched.shutdown(true);
6.總結