Quartz的簡單使用。

1、Java定時器任務調度工具Quartz(純java編寫,十分強大)。由OpenSymphony提供的強大開源任務調度框架。官方網址:http://www.quartz-scheduler.org

特點:a、強大的調度功能。b、靈活的應用方式。3、分佈式和集羣能力。
設計模式:a、Builder模式(JobDetail、Trigger)。b、Factory模式(調度器)。c、組件模式(可插拔哦,耦合度低)。d、鏈式寫法(十分好使哦,超喜歡呢)。

2、Quartz的三個核心概念。
a、調度器(負責定期,定時,定頻率的去執行調度任務)。
b、任務(就是自己開發的業務邏輯)。
c、觸發器(就是時間,Trigger)。

3、Quartz的體系結構。
a、JobDetail(包含了任務的實現類以及類的信息)。
b、Trigger(就是觸發器,決定了任務什麼適合被調用)。Trigger分爲兩種,分別是SimpleTrigger和CronTrigger(功能更強大)。
c、Scheduler(調度器,定時,頂頻率執行jobDetail)。有start方法、stop方法、pause方法、resume方法。等等方法。

4、Quartz的重要組成。
a、Job接口,只有一個方法execute(),此方法裏面實現的就是自己的業務邏輯。JobExecutionContext參數可以進行調度上下文的各種信息。
b、JobDetail,Quartz在每次執行job的時候就會重新創建一個job實例,所以Quartz不節制直接接受一個job實例,相反,它接受一個job實現類,以便運行時通過new Instance()的反射機制實例化job,因此需要通過一個類來描述這個job實現類以及其他相關的靜態信息,如job的名稱,所在組,描述,關聯監聽器等等信息。
c、JobBuilder用戶創建JobDetail實例。
d、JobStore,是一個接口。用來保存job數據的。
e、Trigger,是一個類,用來描述時間觸發規則。
f、TriggerBuilder,用來定義或者創建觸發器的實例的。
g、ThreadPool。線程池,Quartz有這個線程池在執行。
h、Scheduler調度器。代表Quartz獨立運行的容器。可以將JobDetail和Trigger進行組合。其兩者都有自己的名稱和所在組。
i、 Calender,一個Trigger可以和多個Calendar關聯,以排除或包含某些時間點。
j、監聽器,jobListener,TriggerListener,SchedulerListener。


 Quartz代碼練習使用。

1、創建maven工程,然後引入Quartz的jar包。

 1 <project xmlns="http://maven.apache.org/POM/4.0.0"
 2     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 3     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 4     <modelVersion>4.0.0</modelVersion>
 5 
 6     <groupId>com.bie</groupId>
 7     <artifactId>HelloQuartz</artifactId>
 8     <version>0.0.1-SNAPSHOT</version>
 9     <packaging>jar</packaging>
10 
11     <name>HelloQuartz</name>
12     <url>http://maven.apache.org</url>
13 
14     <properties>
15         <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
16     </properties>
17 
18     <dependencies>
19         <dependency>
20             <groupId>junit</groupId>
21             <artifactId>junit</artifactId>
22             <version>3.8.1</version>
23             <scope>test</scope>
24         </dependency>
25         <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
26         <dependency>
27             <groupId>org.quartz-scheduler</groupId>
28             <artifactId>quartz</artifactId>
29             <version>2.2.1</version>
30         </dependency>
31     </dependencies>
32 </project>

2、然後創建一個HelloJob,實現Job接口,編寫自己的業務邏輯。Job定義,實現業務邏輯的任務接口。

Job實例在Quartz中的生命週日,每次調度器執行job的時候,它在調用execute方法前會創建一個新的job實例。當調用完成後,關聯的job對象實例會被釋放,釋放的實例會被垃圾回收機制回收。

JobExecutionContext,當Scheduler調用一個job,就會將JobExecutionContext傳遞給job的execute()方法。job能通過JobExecutionContext對象訪問到Quartz運行時候的環境以及job本身的明細數據。

 1 package com.bie.HelloQuartz;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import org.quartz.Job;
 7 import org.quartz.JobExecutionContext;
 8 import org.quartz.JobExecutionException;
 9 
10 /**
11  * 
12  * @Description TODO
13  * @author biehl
14  * @Date 2019年9月6日 上午11:55:09
15  * 
16  *       首先需要定義一個Quarta的job作業
17  */
18 public class HelloJob implements Job {
19 
20     /**
21      * 實現Job接口的類,需要實現job接口裏面的方法。
22      * 
23      * execute方法是需要執行的業務邏輯。
24      */
25     public void execute(JobExecutionContext arg0) throws JobExecutionException {
26         // 打印當前的執行時間,格式爲2019-09-06 00:00:00
27         Date date = new Date();
28         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
29         System.out.println("Current Exec Time is : " + sdf.format(date));
30         // 編寫具體的業務邏輯。根據自己的需求進行修改即可。
31         System.out.println("hello world !!! Quartz");
32     }
33 
34 }

3、然後實現自己的調度器,首先JobDetail和自己的Job綁定,然後定義好時間Trigger,最後使用Scheduler調度器將JobDetail和Trigger結合到一起。

JobDetail爲Job實例提供了許多設置屬性,以及JobDataMap成員變量屬性,它用來存儲特定job實例的狀態信息,調度器需要藉助JobDetail對象來添加Job實例。

JobDataMap,在進行任務調度時JobDataMap存儲在JobExecutionContext中,非常方便獲取。JobDataMap可以用來裝載任何可序列化的數據對象,當job實例對象被執行時這些參數對象會傳遞給它。JobDataMap實現了jdk的map接口,並且添加了一些非常方便的方法用來存取基本數據類型。

Trigger中是Quartz中的觸發器,用來告訴調度程序作業什麼時候觸發,即Trigger對象是用來觸發執行job的。

 1 package com.bie.HelloQuartz;
 2 
 3 import java.text.SimpleDateFormat;
 4 import java.util.Date;
 5 
 6 import org.quartz.JobBuilder;
 7 import org.quartz.JobDetail;
 8 import org.quartz.Scheduler;
 9 import org.quartz.SchedulerException;
10 import org.quartz.SchedulerFactory;
11 import org.quartz.SimpleScheduleBuilder;
12 import org.quartz.Trigger;
13 import org.quartz.TriggerBuilder;
14 import org.quartz.impl.StdSchedulerFactory;
15 
16 /**
17  * 
18  * @Description TODO
19  * @author biehl
20  * @Date 2019年9月6日 上午11:59:33
21  * 
22  *       測試Quartz的主類
23  *       1、定義自己的job,編輯的是自己的業務邏輯。
24  *       2、定義JobDetail,其中JobDetail用於來綁定自己的job作業。
25  *       3、定義Trigger。需要創建一個SimpleScheduleBuilder,這個用於定義執行的時間,是否重複等等時間要素。
26  *       4、定義Scheduler。通過工廠模式創建,用於綁定自己的jobDetail和trigger。
27  * 
28  */
29 public class HelloScheduler {
30     
31     public static void main(String[] args) {
32         // 創建一個JobDetail實例,將該實例與HelloJob Class進行綁定
33         JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob1", "group1").build();
34         // 創建一個Trigger實例,該實例用於觸發job去執行。什麼適合執行,多長時間執行一次,是否重複執行。
35         SimpleScheduleBuilder simpleScheduleBuilder = SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2)
36                 .repeatForever();
37         Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startNow()
38                 .withSchedule(simpleScheduleBuilder).build();
39         // 創建schedule實例,工廠方法,創建schedule
40         SchedulerFactory schedulerFactory = new StdSchedulerFactory();
41         try {
42             Scheduler scheduler = schedulerFactory.getScheduler();
43             scheduler.start();
44             scheduler.scheduleJob(jobDetail, trigger);
45         } catch (SchedulerException e) {
46             // TODO Auto-generated catch block
47             e.printStackTrace();
48         }
49 
50         // 打印當前的時間,格式爲2019-09-06 00:00:00
51         Date date = new Date();
52         SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
53         System.out.println("Current Time is : " + sdf.format(date));
54     }
55 }

執行效果如下所示:

 

 

待續.......

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章