Spring提供的三種定時任務機制及其比較

2021-04-25 18:49:57 字數 2103 閱讀 6432

定時任務的需求在眾多應用系統中廣泛存在,在spring中,我們可以使用三種不同的定時機制,下面一一描述並加以比較

下面詳細解釋這個類圖中涉及的關鍵類及其使用場景

這是spring中基於quartz的定時機制入口,只要spring容器裝載了這個類,quartz定時機制就會啟動,並載入定義在這個類中的所有trigger

spring配置範例:

實現了trigger介面,基於cron表示式的觸發器

這種觸發器的好處是表示式與linux下的crontab一致,能夠滿足非常複雜的定時需求,也容易配置

spring配置範例:

該類也實現了trigger介面,基於配置的定時排程

這個觸發器的優點在於很容易配置乙個簡單的定時排程策略

spring配置範例:

jobdetail類的簡單擴充套件,能夠包裝乙個繼承自quartzjobbean的普通bean,使之成為定時執行的job

缺點是包裝的bean必須繼承自乙個指定的類,通用性不強,對普通job的侵入性過強,不推薦使用

spring提供的乙個不錯的jobdetail包裝工具,能夠包裝任何bean,並執行類中指定的任何stati或非static的方法,避免強制要求bean去實現某介面或繼承某基礎類

spring配置範例:

quartz中提供了類似webwork的***的功能,系統執行任務前或任務執行完畢後,都會檢查是否有對應的listener需要被執行,這種aop的思想為我們帶來了靈活的業務需求實現方式。

例如現在有乙個簡單的業務要求:任務執行前先判斷當前伺服器是否為task伺服器,不是則不執行任務。對於這種業務需求,我們可以簡單的實現乙個triggerlistener,並將其插入schedule***ctorybean的globaltriggerlisteners中,這樣所有的job在執行前後都會呼叫triggerlistener中對應的方法。

**範例:

jdk提供了基礎的定時類:timer,在這個類的基礎上,spring提供了一套簡單的定時機制

下面詳細解釋這個類圖中涉及的關鍵類及其使用場景

這個類非常類似quartz中的schedule***ctorybean,是基於timer的定時機制的入口,spring容器裝載此類後會自動開始定時器

spring配置範例:

類似於quartz中的trigger的******triggerbean實現,任務是在設定的時間觸發並執行配置的任務,特點是配置簡單、明了,使用於簡單的任務觸發邏輯

spring配置範例:

普通task實現必須要繼承的父類,主要包含乙個run()的方法,類似quartz中的quartzjobbean,對應用侵入性較強,也不推薦使用

類似quartz中的methodinvokingjobdetailfactorybean,用於封裝任何bean,並可以執行bean中的任意方法,不再複述

這種定時機制與上面兩種定時機制沒有太大區別,特別是在配置和實現功能上,不同的是它的核心是基於scheduledexecutorservice(scheduledthreadpoolexecutor是預設實現),一種jdk5.0中提供的基於執行緒的併發機制,關於jdk5中的執行緒池的概念及其一些深入分析,請參考老唐的部落格:http://blog.csdn.net/sfdev/archive/2008/12/30/3648457.aspx 這裡不再複述

看完了這三種定時機制,各有各的優劣,不同場景下我們應該靈活選擇不同的定時機制。總的來說,如果我們需要簡單的定時器,我們可以選用基於timer的定時器,如果定時規則較為複雜,我們可以選用基於quartz的定時器,如果我們要用到執行緒池來處理非同步任務,我們可以選用基於executor的定時機制,雖然只是任務實現中用到執行緒池,畢竟也是一脈相承的,當然也可以用quartz的定時器+基於executor的任務執行緒池,完全沒有任何衝突的。

說這麼多,還是比較抽象,不如我們來分析一下老唐的notify系統來加深對spring定時機制的了解(詳細設計參考最近一期的程式設計師雜誌)。

在老唐的notify系統中,完全使用了基於jdk5.0中的executor的定時機制,即由乙個scheduledexecuto***ctorybean觸發系統的每隔2分鐘執行乙個單執行緒的任務,在這個任務中,執行完各種機制檢查和配置策略後,將要執行的notify任務放入乙個已配置好的執行緒池,並由執行緒池指定執行緒來完成notify的任務。

Spring定時任務

sayhello 0 08 21 下面的表示式 0 15 10 6l 2002 2005 將在2002年到2005年的每個月的最後乙個星期五上午10點15分執行作業。你不可能用 trigger來做這些事情。你可以用兩者之中的任何乙個,但哪個跟合適則取決於你的排程需要。更多詳細介紹參考此處 關於cro...

spring 定時任務

xmlns 多加下面的內容 xmlns task 然後xsi schemalocation多加下面的內容 spring task 3.1.xsd最後是我們的task任務掃瞄註解 或者 public inte ce imytestservice component import org.springf...

Spring 定時任務

scheduled cron 0 0 1 override public synchronized void dojob throws exception 字段 允許值 允許的特殊字元 秒 0 59 分 0 59 小時 0 23 日期 1 31 l w c 月份 1 12 或者 jan dec 星期...