Quartz基本使用,Quartz使用
1.Quartz概述:簡單的說就是java的一個定時任務的架構,沒有那麼複雜的解釋,跟前端的定時器一樣。在瞭解它之前,首先熟悉幾個概念。
2.基本概念
2.1 Job:表示一個工作,要執行的具體內容。此介面中只有一個方法 void execute(JobExecutionContext context)
2.2 JobDetail:JobDetail 表示一個具體的可執行檔發送器, Job 是這個可執行程發送器所要執行的內容,另外 JobDetail 還包含了這個任務調度的方案和策略。
2.3 Trigger 代表一個調度參數的配置,什麼時候去調。
2.4 Scheduler 代表一個調度容器,一個調度容器中可以註冊多個 JobDetail 和 Trigger。當Trigger 與 JobDetail 組合,就可以被 Scheduler 容器調度了。
解釋:
l 編寫 job 實現業務,要做什麼具體事情問題。
l 使用 JobDetail 封裝 job,是任務對象,可以被調度
l 使用 Trigger (觸發器對象)定製什麼時候去調用某任務對象。
l 使用 Scheduler 結合任務對象和觸發器對象,很像一個大管家。
3.運行原理
1、scheduler 是一個計劃調度器容器(總部),容器裡面可以盛放眾多的 JobDetail 和 trigger,
當容器啟動後,裡面的每個 JobDetail 都會根據 trigger 按部就班自動去執行。
2、 JobDetail 是一個可執行檔工作,它本身可能是有狀態的。
3、 Trigger 代表一個調度參數的配置,什麼時候去調。
4、當 JobDetail 和 Trigger 在 scheduler 容器上註冊後,形成了裝配好的作業(JobDetail 和
Trigger 所組成的一對兒),就可以伴隨容器啟動而調度執行了。
5、 scheduler 是個容器,容器中有一個線程池,用來並行調度執行每個作業,這樣可以提
高容器效率
3.案例:
3.1簡單任務
3.1.1:引入相關的jar包
3.1.2:編寫相關的任務
代碼如下:
1 package cn.itcast.test; 2 3 import org.junit.Test; 4 import org.quartz.JobBuilder; 5 import org.quartz.JobDetail; 6 import org.quartz.Scheduler; 7 import org.quartz.SchedulerException; 8 import org.quartz.SimpleScheduleBuilder; 9 import org.quartz.Trigger;10 import org.quartz.TriggerBuilder;11 import org.quartz.impl.StdSchedulerFactory;12 13 import cn.itcast.service.HelloJob;14 15 public class Testquartz {16 17 // 簡單任務測試18 @Test19 public void testSimpleTask(){20 21 try {22 23 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();24 scheduler.start();25 26 // define the job and tie it to our HelloJob class27 JobDetail job = JobBuilder.newJob(HelloJob.class)28 .withIdentity("job1", "group1")29 .build();30 31 // Trigger the job to run now, and then repeat every 40 seconds32 Trigger trigger = TriggerBuilder.newTrigger()33 .withIdentity("trigger1", "group1")34 .startNow()35 .withSchedule(SimpleScheduleBuilder.simpleSchedule()36 .withIntervalInSeconds(3)37 .repeatForever()) 38 .build();39 40 // Tell quartz to schedule the job using our trigger41 scheduler.scheduleJob(job, trigger);42 43 //不讓junit終止jvm44 while(true){45 46 }47 48 } catch (SchedulerException se) {49 se.printStackTrace();50 }51 }52 53 }View Code
3.1.3:計劃任務
和簡單任務相比,主要區別是策略不同
1 public class QuartzTest { 2 3 // 複雜任務 4 @Test 5 public void testCronTrigger() throws SchedulerException{ 6 // 擷取調度器 7 Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler(); 8 9 // 開啟大管家10 scheduler.start();11 12 // define the job and tie it to our HelloJob class13 JobDetail job = JobBuilder.newJob(HelloQuartz.class)14 .withIdentity("job1", "group1")15 .build();16 17 // Trigger the job to run now, and then repeat every 40 seconds18 Trigger trigger = TriggerBuilder.newTrigger()19 .withIdentity("trigger1", "group1")20 .startNow()21 // 每隔5秒執行22 .withSchedule(CronScheduleBuilder.cronSchedule("0/5 * * ? * *")) 23 .build();24 25 // Tell quartz to schedule the job using our trigger26 scheduler.scheduleJob(job, trigger);27 28 // 終止JVM執行29 while(true){30 31 }32 33 } View Code
本測試使用的jar包:
1 <dependencies> 2 <dependency> 3 <groupId>org.quartz-scheduler</groupId> 4 <artifactId>quartz</artifactId> 5 <version>2.2.3</version> 6 </dependency> 7 <dependency> 8 <groupId>org.quartz-scheduler</groupId> 9 <artifactId>quartz-jobs</artifactId>10 <version>2.2.3</version>11 </dependency>12 <!-- slf4j log4j -->13 <dependency>14 <groupId>org.slf4j</groupId>15 <artifactId>slf4j-log4j12</artifactId>16 <version>1.7.7</version>17 </dependency>18 <dependency>19 <groupId>junit</groupId>20 <artifactId>junit</artifactId>21 <version>4.11</version>22 <scope>test</scope>23 </dependency>24 </dependencies>
View Code