天天看點

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

在我們的觸發器監聽器中,也包含了一系列監聽方法

方法

說明

getname()

定義并傳回監聽器的名字

triggerfired()

當與監聽器相關聯的 trigger 被觸發,job 上的 execute() 方法将要被執行時,scheduler 就調用這個方法。在全局 triggerlistener 情況下,這個方法為所有 trigger 被調用。

vetojobexecution()

在 trigger 觸發後,job 将要被執行時由 scheduler 調用這個方法。triggerlistener 給了一個選擇去否決 job 的執行。假如這個方法傳回 true,這個 job 将不會為此次 trigger 觸發而得到執行。

triggermisfired()

scheduler 調用這個方法是在 trigger 錯過觸發時。如這個方法的 javadoc 所指出的,你應該關注此方法中持續時間長的邏輯:在出現許多錯過觸發的 trigger 時,長邏輯會導緻骨牌效應。你應當保持這上方法盡量的小。

triggercomplete()

trigger 被觸發并且完成了 job 的執行時,scheduler 調用這個方法。這不是說這個 trigger 将不再觸發了,而僅僅是目前 trigger 的觸發(并且緊接着的 job 執行) 結束時。這個 trigger 也許還要在将來觸發多次的。

下面是我們的監聽器執行個體配置

使用triggerlistener和joblistener的方法大同小異,思路都是一樣的。

相對于上一篇文章的配置,我們隻需将joblistener替換成triggerlistener即可。下面是我們的完整測試代碼:

運作程式,我們會看到:

trigger 被觸發了,此時job 上的 execute() 方法将要被執行 發現此次job的相關資源準備存在問題,不便展開任務,傳回true表示否決此次任務執行——————我們的trigger監聽器要否決我們的任務,觸發了相應的監聽方法,同時後續的complete監聽方法自然不會再被執行 被否決執行了,可以做些日志記錄。——————我們的picknewsjob被否決了,觸發了相應的監聽方法 在13:15:39根據文章的閱讀量和評論量來生成我們的最熱文章清單 發現此次job的相關資源準備存在問題,不便展開任務,傳回true表示否決此次任務執行 被否決執行了,可以做些日志記錄。 在13:15:42根據文章的閱讀量和評論量來生成我們的最熱文章清單

如果我們将triggerlistener中的vetojobexecution()方法改成如下所示:

再運作我們的測試程式,會列印:

不否決job,正常執行 myjoblistener觸發對class tool.job.picknewsjob的開始執行的監聽工作,這裡可以完成任務前的一些資源準備工作或日志記錄 在13:20:20扒取新聞 在13:20:20根據文章的閱讀量和評論量來生成我們的最熱文章清單 myjoblistener觸發對class tool.job.picknewsjob結束執行的監聽工作,這裡可以進行資源銷毀工作或做一些新聞扒取結果的統計工作 trigger 被觸發并且完成了 job 的執行,此方法被調用 在13:20:22扒取新聞 在13:20:23根據文章的閱讀量和評論量來生成我們的最熱文章清單 我們的job不被否決,同時有後續的job成功執行的監聽方法調用

我們可以調用如下所示測試代碼:

調用此方法,我們和得到和1.+版本中類似的結果:

根據文章的閱讀量和評論量來生成我們的最熱文章清單