quartz--job
job是執行任務所需的Java類。
在quartz中job分為兩種,有狀態和無狀態的。job是無狀態的,statefuljob是有狀態的。
通過實現job或者statefuljob接口就能定義一個自己的工作類。這兩個接口都要求實現類實現execute方法
public void execute(JobExecutionContext context) throws JobExecutionException;
在job被Scheduler調用時,會傳遞一個JobExecutionContext給execute方法,它能訪問job的信息。
jobExecutionContext能獲取到JobDetail對象,jobDerail對象保存了job的信息,job注冊到JobDetail中,然后JobDetail注冊進Scheduler中去。
當要執行job是job才會被實例化,每次執行job都會實例化一個新的job對象,不必擔心job的線程安全問題。
Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
scheduler.start(); JobDetail jobDetail = new JobDetail("PrintJobDataMapJob",Scheduler.DEFAULT_GROUP,TestJob.class);//把job類--TestJob注冊進JobDetail中 Trigger trigger = TriggerUtils.makeImmediateTrigger(0, 1000); trigger.setName("PrintJobDataMapJobTrigger"); scheduler.scheduleJob(jobDetail,trigger);//把JobDetail注冊進Scheduler中
使用JobDetail對象的getJObDataMap()方法獲取存儲job要保存的自定義屬性的map集合,JobDataMap實現了Map集合,具有Map的特性,JobDataMap中的數據可以在job類中進行傳遞和訪問。
實現job接口的job類是無狀態的,要想job有狀態,需要實現stateFulJob接口。
StateFulJob是job的一個擴展接口,與job一樣需要實現execute方法。
job和stateFulJob的區別:
多個有狀態StateFulJob的JobDetail無法並發執行。或者兩個trigger觸發stateFulJob的條件是同時發生的,有一個trigger會被一直阻塞,直到另外的trigger處理完畢才會執行。
job的易失性、持久性和可恢復性
易失性:易失性的job在程序關閉后不會被持久化。可以通過JobDetail的setVolaility(true)來把job設置為易失性的。默認是false的。
持久性:持久的job保存在jobstore中,當一個job是連續性的,沒有trigger觸發job,job還會保存在jobstore中,如果不是連續性的,就回被移除jobstore。通過JobDetail的setDurability(boolean)方法設置是否是連續性的,為true時不會被移除。
可恢復性:在job還在執行是,Scheduler被意外關閉,在Scheduler重啟之后job還可以恢復,在次重頭開始執行。通過setRequestRecovery(boolean shuldRecovery)設置是否是可恢復的。默認是false不可恢復。