JAVA定時任務(wù)相關(guān)


前言

在實際項目開發(fā)中,除了Web應(yīng)用衙傀、SOA服務(wù)外抬吟,還有一類不可缺少的,那就是定時任務(wù)調(diào)度统抬。定時任務(wù)的場景可以說非常廣泛火本,比如某些視頻網(wǎng)站,購買會員后聪建,每天會給會員送成長值钙畔,每月會給會員送一些電影券;比如在保證最終一致性的場景中金麸,往往利用定時任務(wù)調(diào)度進(jìn)行一些比對工作擎析;比如一些定時需要生成的報表、郵件挥下;比如一些需要定時清理數(shù)據(jù)的任務(wù)等揍魂。本篇博客將系統(tǒng)的介紹定時任務(wù)調(diào)度,會涵蓋Timer棚瘟、ScheduledExecutorService现斋、開源工具包Quartz,以及Spring和Quartz的結(jié)合等內(nèi)容偎蘸。

JDK原生定時工具:Timer

定時任務(wù)調(diào)度:基于給定的時間點(diǎn)庄蹋、給定的時間間隔、給定的執(zhí)行次數(shù)自動執(zhí)行的任務(wù)禀苦。

Timer位于java.util包下蔓肯,其內(nèi)部包含且僅包含一個后臺線程(TimeThread)對多個業(yè)務(wù)任務(wù)(TimeTask)進(jìn)行定時定頻率的調(diào)度。

schedule的四種用法和scheduleAtFixedRate的兩種用法

Timer的核心方法

參數(shù)說明:

task:所要執(zhí)行的任務(wù)振乏,需要extends TimeTask override run()

time/firstTime:首次執(zhí)行任務(wù)的時間

period:周期性執(zhí)行Task的時間間隔蔗包,單位是毫秒

delay:執(zhí)行task任務(wù)前的延時時間,單位是毫秒

很顯然慧邮,通過上述的描述调限,我們可以實現(xiàn):

延遲多久后執(zhí)行一次任務(wù);指定時間執(zhí)行一次任務(wù)误澳;延遲一段時間耻矮,并周期性執(zhí)行任務(wù);指定時間忆谓,并周期性執(zhí)行任務(wù)裆装;

思考1:如果time/firstTime指定的時間,在當(dāng)前時間之前,會發(fā)生什么呢?

在時間等于或者超過time/firstTime的時候,會執(zhí)行task沸版!也就是說,如果time/firstTime指定的時間在當(dāng)前時間之前载荔,就會立即得到執(zhí)行。

思考2:schedule和scheduleAtFixedRate有什么區(qū)別采桃?

scheduleAtFixedRate:每次執(zhí)行時間為上一次任務(wù)開始起向后推一個period間隔懒熙,也就是說下次執(zhí)行時間相對于上一次任務(wù)開始的時間點(diǎn),因此執(zhí)行時間不會延后普办,但是存在任務(wù)并發(fā)執(zhí)行的問題工扎。

schedule:每次執(zhí)行時間為上一次任務(wù)結(jié)束后推一個period間隔,也就是說下次執(zhí)行時間相對于上一次任務(wù)結(jié)束的時間點(diǎn)泌豆,因此執(zhí)行時間會不斷延后定庵。

思考3:如果執(zhí)行task發(fā)生異常,是否會影響其他task的定時調(diào)度踪危?

如果TimeTask拋出RuntimeException蔬浙,那么Timer會停止所有任務(wù)的運(yùn)行!

思考4:Timer的一些缺陷贞远?

前面已經(jīng)提及到Timer背后是一個單線程畴博,因此Timer存在管理并發(fā)任務(wù)的缺陷:所有任務(wù)都是由同一個線程來調(diào)度,所有任務(wù)都是串行執(zhí)行蓝仲,意味著同一時間只能有一個任務(wù)得到執(zhí)行俱病,而前一個任務(wù)的延遲或者異常會影響到之后的任務(wù)。

其次袱结,Timer的一些調(diào)度方式還算比較簡單亮隙,無法適應(yīng)實際項目中任務(wù)定時調(diào)度的復(fù)雜度。

一個簡單的Demo實例

Timer Demo
運(yùn)行結(jié)果

Timer其他需要關(guān)注的方法

cancel():終止Timer計時器垢夹,丟棄所有當(dāng)前已安排的任務(wù)(TimeTask也存在cancel()方法溢吻,不過終止的是TimeTask)

purge():從計時器的任務(wù)隊列中移除已取消的任務(wù),并返回個數(shù)

JDK對定時任務(wù)調(diào)度的線程池支持:ScheduledExecutorService

由于Timer存在的問題果元,JDK5之后便提供了基于線程池的定時任務(wù)調(diào)度:ScheduledExecutorService促王。

設(shè)計理念:每一個被調(diào)度的任務(wù)都會被線程池中的一個線程去執(zhí)行,因此任務(wù)可以并發(fā)執(zhí)行而晒,而且相互之間不受影響蝇狼。

我們直接看例子:

基于線程池的定時任務(wù)調(diào)度

運(yùn)行結(jié)果:

result

定時任務(wù)大哥:Quartz

雖然ScheduledExecutorService對Timer進(jìn)行了線程池的改進(jìn),但是依然無法滿足復(fù)雜的定時任務(wù)調(diào)度場景倡怎。因此OpenSymphony提供了強(qiáng)大的開源任務(wù)調(diào)度框架:Quartz迅耘。Quartz是純Java實現(xiàn)贱枣,而且作為Spring的默認(rèn)調(diào)度框架,由于Quartz的強(qiáng)大的調(diào)度功能豹障、靈活的使用方式冯事、還具有分布式集群能力焦匈,可以說Quartz出馬血公,可以搞定一切定時任務(wù)調(diào)度!

Quartz的體系結(jié)構(gòu)

Quartz體系結(jié)構(gòu)

先來看一個Demo:

業(yè)務(wù)Job
Quartz

說明:

1缓熟、從代碼上來看累魔,有XxxBuilder、XxxFactory够滑,說明Quartz用到了Builder垦写、Factory模式,還有非常易懂的鏈?zhǔn)骄幊田L(fēng)格彰触。

2梯投、Quartz有3個核心概念:調(diào)度器(Scheduler)、任務(wù)(Job&JobDetail)况毅、觸發(fā)器(Trigger)分蓖。(一個任務(wù)可以被多個觸發(fā)器觸發(fā),一個觸發(fā)器只能觸發(fā)一個任務(wù))

3尔许、注意當(dāng)Scheduler調(diào)度Job時么鹤,實際上會通過反射newInstance一個新的Job實例(待調(diào)度完畢后銷毀掉),同時會把JobExecutionContext傳遞給Job的execute方法味廊,Job實例通過JobExecutionContext訪問到Quartz運(yùn)行時的環(huán)境以及Job本身的明細(xì)數(shù)據(jù)蒸甜。

4、JobDataMap可以裝載任何可以序列化的數(shù)據(jù)余佛,存取很方便柠新。需要注意的是JobDetail和Trigger都可以各自關(guān)聯(lián)上JobDataMap。JobDataMap除了可以通過上述代碼獲取外辉巡,還可以在YourJob實現(xiàn)類中恨憎,添加相應(yīng)setter方法獲取。

5红氯、Trigger用來告訴Quartz調(diào)度程序什么時候執(zhí)行框咙,常用的觸發(fā)器有2種:SimpleTrigger(類似于Timer)、CronTrigger(類似于Linux的Crontab)痢甘。

6喇嘱、實際上,Quartz在進(jìn)行調(diào)度器初始化的時候塞栅,會加載quartz.properties文件進(jìn)行一些屬性的設(shè)置者铜,比如Quartz后臺線程池的屬性(threadCount)、作業(yè)存儲設(shè)置等。它會先從工程中找作烟,如果找不到那么就是用quartz.jar中的默認(rèn)的quartz.properties文件愉粤。

7、Quartz存在監(jiān)聽器的概念拿撩,比如任務(wù)執(zhí)行前后衣厘、任務(wù)的添加等,可以方便實現(xiàn)任務(wù)的監(jiān)控压恒。

CronTrigger示例

CronTrigger

Cron表達(dá)式的寫法

特殊符號說明
cron表達(dá)式
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末影暴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子探赫,更是在濱河造成了極大的恐慌型宙,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伦吠,死亡現(xiàn)場離奇詭異妆兑,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)毛仪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進(jìn)店門搁嗓,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人潭千,你說我怎么就攤上這事谱姓。” “怎么了刨晴?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵屉来,是天一觀的道長。 經(jīng)常有香客問我狈癞,道長茄靠,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任蝶桶,我火速辦了婚禮慨绳,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘真竖。我一直安慰自己脐雪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布恢共。 她就那樣靜靜地躺著战秋,像睡著了一般。 火紅的嫁衣襯著肌膚如雪讨韭。 梳的紋絲不亂的頭發(fā)上脂信,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天癣蟋,我揣著相機(jī)與錄音,去河邊找鬼狰闪。 笑死疯搅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的埋泵。 我是一名探鬼主播幔欧,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼秋泄!你這毒婦竟也來了琐馆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤恒序,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后谁撼,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體歧胁,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年厉碟,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊巍。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡箍鼓,死狀恐怖崭参,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情款咖,我是刑警寧澤何暮,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站铐殃,受9級特大地震影響海洼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜富腊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一坏逢、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧赘被,春花似錦是整、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至阳欲,卻和暖如春舵盈,著一層夾襖步出監(jiān)牢的瞬間陋率,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工秽晚, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瓦糟,地道東北人。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓赴蝇,卻偏偏與公主長得像菩浙,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子句伶,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 引言 在實際項目開發(fā)中劲蜻,定時任務(wù)調(diào)度是經(jīng)常會出現(xiàn)的一類需求。定時任務(wù)的場景可以說非常廣泛考余,例如: 購買某些視頻網(wǎng)站...
    GeekerLou閱讀 4,750評論 0 0
  • 一點(diǎn)知識 在JAVA開發(fā)領(lǐng)域先嬉,目前可以通過以下幾種方式進(jìn)行定時任務(wù): Timer:jdk中自帶的一個定時調(diào)度類,可...
    雅倩蘭爸爸閱讀 3,841評論 1 28
  • 前言 在實際項目開發(fā)中楚堤,除了Web應(yīng)用疫蔓、SOA服務(wù)外,還有一類不可缺少的身冬,那就是定時任務(wù)調(diào)度衅胀。定時任務(wù)的場景可以說...
    張豐哲閱讀 29,788評論 15 57
  • 前言 在實際項目開發(fā)中,除了Web應(yīng)用酥筝、SOA服務(wù)外滚躯,還有一類不可缺少的,那就是定時任務(wù)調(diào)度嘿歌。定時任務(wù)的場景可以說...
    高級java架構(gòu)師閱讀 469評論 0 3
  • 前言 在實際項目開發(fā)中掸掏,除了Web應(yīng)用、SOA服務(wù)外搅幅,還有一類不可缺少的阅束,那就是定時任務(wù)調(diào)度。定時任務(wù)的場景可以說...
    java溫小馨閱讀 512評論 0 2