天天看點

Quartz任務排程(4)JobListener分版本超詳細解析JobListener源碼下載下傳

相對spring的事件實作,quartz這邊簡化了許多,我們隻需:

1. 自定義監聽器接口實作類

2. 向scheduler中注冊監聽器實作類

隻需以上兩步即可我完成我們的事件監聽。對于監聽器實作類中,可能有些方法不是我們需要的,這時候我們隻需給出空實作即可。在quartz中,監聽器類型主要分為三種,和quartz三個核心類相對應:joblistener,triggerlistener,schedulerlistener。下面我們先分析joblistener的使用方法。其他兩種監聽器留待後面系列文章詳解

我們的joblistener實作類必須實作其以下方法:

方法

說明

getname()

getname() 方法傳回一個字元串用以說明 joblistener 的名稱。對于注冊為全局的監聽器,getname() 主要用于記錄日志,對于由特定 job 引用的 joblistener,注冊在 jobdetail 上的監聽器名稱必須比對從監聽器上 getname() 方法的傳回值。

jobtobeexecuted()

scheduler 在 jobdetail 将要被執行時調用這個方法。

jobexecutionvetoed()

scheduler 在 jobdetail 即将被執行,但又被 triggerlistener 否決了時調用這個方法。

jobwasexecuted()

scheduler 在 jobdetail 被執行之後調用這個方法。

這裡有兩種方式,一種是注冊為全局監聽器,對所有的jobdetail都有效,另一種是注冊為針對特定jobdetail的局部監聽器。針對不同的版本,有不同的配置方式

在測試中我們用到工作實作類為

在1.+版本中,我們可以通過如下代碼監聽job

下面是我們的完整測試代碼:

現在是使用局部監聽器的配置,運作程式,控制台列印:

myjoblistener觸發對class tool.job.picknewsjob的開始執行的監聽工作,這裡可以完成任務前的一些資源準備工作或日志記錄 在11:18:31扒取新聞 在11:18:31根據文章的閱讀量和評論量來生成我們的最熱文章清單————————從這裡我們可以看出兩個工作是異步進行的 myjoblistener觸發對class tool.job.picknewsjob結束執行的監聽工作,這裡可以進行資源銷毀工作或做一些新聞扒取結果的統計工作 在11:18:33扒取新聞 在11:18:34根據文章的閱讀量和評論量來生成我們的最熱文章清單 我們細心觀察還會發現,我們兩個工作都運作了三次,但我們在配置觸發器時,repeatcount都是設為2。這說明我們的任務排程特點是:主執行了1次,重複了2次,于是共執行3(1+repeatcount)次。

如果我們注釋掉局部監聽代碼,啟用全局監聽,會看到控制台列印:

myjoblistener觸發對class tool.job.gethottestjob的開始執行的監聽工作,這裡可以完成任務前的一些資源準備工作或日志記錄 在11:25:41扒取新聞 在11:25:41根據文章的閱讀量和評論量來生成我們的最熱文章清單 myjoblistener觸發對class tool.job.gethottestjob結束執行的監聽工作,這裡可以進行資源銷毀工作或做一些新聞扒取結果的統計工作 在11:25:43扒取新聞 在11:25:44根據文章的閱讀量和評論量來生成我們的最熱文章清單 即我們的兩個任務都被監聽了

在2.+版本中,引入了**org.quartz.listenermanager和org.quartz.matcher

**來對我們的監聽器進行更細粒度的管理配置

我們通過listenermanager向scheduler中添加我們的監聽器。它針對jobdetail的常用方法有:

1. public void addjoblistener(joblistener joblistener)

添加全局監聽器,即所有jobdetail都會被此監聽器監聽

2. public void addjoblistener(joblistener joblistener, matcher matcher)

添加帶條件比對的監聽器,在matcher中聲明我們的比對條件

3. public void addjoblistener(joblistener joblistener, matcher … matchers)

添加附帶不定參條件陪陪的監聽器

4. public boolean removejoblistener(string name)

根據名字移除joblistener

5. public list getjoblisteners()

擷取所有的監聽器

6. public joblistener getjoblistener(string name)

根據名字擷取監聽器

我們通過matcher讓不同的監聽器監聽不同的任務。它有很多實作類,先逐一分析如下:

根據jobkey進行比對,每個jobdetail都有一個對應的jobkey,裡面存儲了jobname和jobgroup來定位唯一的jobdetail。它的常用方法有:

根據組名資訊比對,它的常用方法有:

對兩個比對器取交集,執行個體如下:

對兩個比對器取并集,執行個體如下:

局部全局比對,它有兩個構造方法:

下面是我們的完整測試測序:

運作程式,我們得到下列列印資訊:

根據文章的閱讀量和評論量來生成我們的最熱文章清單 在12:48:58扒取新聞 在12:48:59扒取新聞 顯然,myjoblistener隻和我們的picknewsjob比對了。 關于測試代碼的其他配置可移步參考本系列前面的文章,裡面都有詳細的配置執行個體講解