為什么80%的碼農都做不了架構師?>>> ??
Quartz2?
?????說白了,就是個功能比較完善的定時器,可以通過指定的時間執行指定的任務。
?
應用范圍
????a.比如讓商城的活動(對象)在指定的時間(定時)從發布變為激活
????b.比如平臺每天2:00去給用戶發送通知。
????c.本來指定商城每天2:00發通知,但是碰到了星期天(觸發器)改為1:00發通知
????定時器的應用范圍其實很廣,上面只是簡單舉了幾個例子。
?
準備
????資源下載地址:http://www.quartz-scheduler.org/
????<dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz</artifactId><version>2.2.1</version></dependency><dependency><groupId>org.quartz-scheduler</groupId><artifactId>quartz-jobs</artifactId><version>2.2.1</version></dependency>
????如上在pom.xml加入要引入的jar包
?
Quartz中的設計模式
-
Builder模式
-
所有關鍵組件都有Builder模式來構建 ?<Builder> 如:JobBuilder、TriggerBuilder
-
-
Factory模式
-
最終由Scheduler的來進行組合各種組件 ?<Factory> 如SchedulerFactory
-
-
Quartz項目中大量使用組件模式,插件式設計,可插拔,耦合性低,易擴展,開發者可自行定義自己的Job、Trigger等組件
-
鏈式寫法,Quartz中大量使用鏈式寫法,與jQuery的寫法有幾分相似,實現也比較簡單,如:
-
?$(this).addClass("divCurrColor").next(".divContent").css("display","block"); ?
-
newTrigger().withIdentity(?"trigger3",?"group1").startAt(?startTime)
??????? .withSchedule(simpleSchedule().withIntervalInSeconds(10).withRepeatCount(10)).build();
-
?
框架核心分析
?
-
SchedulerFactory ? ?-- 調度程序工廠
-
ThreadExecutor / DefaultThreadExecutor ? -- 內部線程操作對象
-
StdSchedulerFactory ? -- Quartz默認的SchedulerFactory
-
DirectSchedulerFactory ?--???DirectSchedulerFactory是對SchedulerFactory的直接實現,通過它可以直接構建Scheduler、threadpool?等
-
-
JobExecutionContext -- JOB上下文,保存著Trigger、?JobDeaitl?等信息,JOB的execute方法傳遞的參數就是對象的實例
-
JobExecutionContextImpl
-
-
Scheduler?? ?-- 調度器
-
StdScheduler ? ?--?Quartz默認的Scheduler
-
RemoteScheduler ?-- 帶有RMI功能的Scheduler
-
-
JOB?--任務對象
-
JobDetail ?-- 他是實現輪詢的一個的回調類,可將參數封裝成JobDataMap對象,Quartz將任務的作業狀態保存在JobDetail中.
-
JobDataMap --??JobDataMap用來報錯由JobDetail傳遞過來的任務實例對象
-
-
Trigger
-
SimpleTrigger <普通的Trigger> -- ?SimpleScheduleBuilder
-
CronTrigger ?<帶Cron Like 表達式的Trigger> --?CronScheduleBuilder
-
CalendarIntervalTrigger <帶日期觸發的Trigger> --?CalendarIntervalScheduleBuilder
-
DailyTimeIntervalTrigger <按天觸發的Trigger> --?DailyTimeIntervalScheduleBuilder
-
-
ThreadPool ?--??為Quartz運行任務時提供了一些線程
-
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();??//這里指定的HelloJob.class是job1的實現//?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);
?
一句話實現:
? ?1、創建調度工廠(); ? ?//工廠模式
? ?2、根據工廠取得調度器實例(); ?//工廠模式
? ?3、Builder模式構建子組件<Job,Trigger> ?//?builder模式, 如JobBuilder、TriggerBuilder、DateBuilder
? ?4、通過調度器組裝子組件 ? 調度器.組裝<子組件1,子組件2...> ?//工廠模式
? ?5、調度器.start();?//工廠模式
**************************************************************************************************
********來源:http://blog.csdn.net/chenweitang123/article/details/37777399**********
**************************************************************************************************
?