Java中的任務(wù)調(diào)度

任務(wù)調(diào)度是指基于給定時(shí)間點(diǎn)森篷,給定時(shí)間間隔或者給定執(zhí)行次數(shù)自動(dòng)執(zhí)行任務(wù)。

Java中幾種任務(wù)調(diào)度方式

  • Timer
  • ScheduledExecutor

Timer

使用 Timer 實(shí)現(xiàn)任務(wù)調(diào)度的核心類是 Timer 和 TimerTask篮幢。其中 Timer 負(fù)責(zé)設(shè)定 TimerTask 的起始與間隔執(zhí)行時(shí)間。使用者只需要?jiǎng)?chuàng)建一個(gè) TimerTask 的繼承類,實(shí)現(xiàn)自己的 run 方法惠拭,然后將其丟給 Timer 去執(zhí)行即可。

Timer 的設(shè)計(jì)核心是一個(gè) TaskList 和一個(gè) TaskThread庸论。Timer 將接收到的任務(wù)丟到自己的 TaskList 中斗蒋,TaskList 按照 Task 的最初執(zhí)行時(shí)間進(jìn)行排序拆挥。TimerThread 在創(chuàng)建 Timer 時(shí)會(huì)啟動(dòng)成為一個(gè)守護(hù)線程。這個(gè)線程會(huì)輪詢所有任務(wù),找到一個(gè)最近要執(zhí)行的任務(wù)丁存,然后休眠焊傅,當(dāng)?shù)竭_(dá)最近要執(zhí)行任務(wù)的開始時(shí)間點(diǎn)虐秋,TimerThread 被喚醒并執(zhí)行該任務(wù)模她。之后 TimerThread 更新最近一個(gè)要執(zhí)行的任務(wù),繼續(xù)休眠扛禽。
Timer 是一種定時(shí)器工具锋边,用來(lái)在一個(gè)后臺(tái)線程計(jì)劃執(zhí)行指定任務(wù),而 TimerTask 一個(gè)抽象類旋圆,它的子類代表一個(gè)可以被 Timer 計(jì)劃的任務(wù)宠默。

Timer 的缺陷:
1、Timer 管理時(shí)間延遲缺陷
但由于所有任務(wù)都是由同一個(gè)線程來(lái)調(diào)度灵巧,因此所有任務(wù)都是串行執(zhí)行的搀矫,同一時(shí)間只能有一個(gè)任務(wù)在執(zhí)行,前一個(gè)任務(wù)的延遲或異常都將會(huì)影響到之后的任務(wù)刻肄。還有Timer 是基于絕對(duì)時(shí)間的瓤球,對(duì)系統(tǒng)時(shí)間比較敏感。
2敏弃、Timer 拋出異常缺陷
如果 TimerTask 拋出 RuntimeException卦羡,Timer 會(huì)終止所有任務(wù)的運(yùn)行。

ScheduledExecutorService

對(duì)于 Timer 的缺陷,我們可以考慮 ScheduledThreadPoolExecutor 來(lái)替代绿饵。Timer 是基于絕對(duì)時(shí)間的欠肾,對(duì)系統(tǒng)時(shí)間比較敏感,而 ScheduledThreadPoolExecutor 則是基于相對(duì)時(shí)間拟赊;Timer 是內(nèi)部是單一線程刺桃,而 ScheduledThreadPoolExecutor 內(nèi)部是個(gè)線程池,所以可以支持多個(gè)任務(wù)并發(fā)執(zhí)行吸祟。
其設(shè)計(jì)思想是瑟慈,每一個(gè)被調(diào)度的任務(wù)都會(huì)由線程池中一個(gè)線程去執(zhí)行,因此任務(wù)是并發(fā)執(zhí)行的屋匕,相互之間不會(huì)受到干擾葛碧。需要注意的是,只有當(dāng)任務(wù)的執(zhí)行時(shí)間到來(lái)時(shí)过吻,ScheduedExecutor 才會(huì)真正啟動(dòng)一個(gè)線程进泼,其余時(shí)間 ScheduledExecutor 都是在輪詢?nèi)蝿?wù)的狀態(tài)。

用 ScheduledExecutor 和 Calendar 實(shí)現(xiàn)復(fù)雜任務(wù)調(diào)度

Timer 和 ScheduledExecutor 都僅能提供基于開始時(shí)間與重復(fù)間隔的任務(wù)調(diào)度纤虽,不能勝任更加復(fù)雜的調(diào)度需求缘琅。比如,設(shè)置每星期二的 16:38:10 執(zhí)行任務(wù)廓推。該功能使用 Timer 和 ScheduledExecutor 都不能直接實(shí)現(xiàn),但我們可以借助 Calendar 間接實(shí)現(xiàn)該功能翩隧。
XXL-JOB
http://www.xuxueli.com/xxl-job/#/?id=%E3%80%8A%E5%88%86%E5%B8%83%E5%BC%8F%E4%BB%BB%E5%8A%A1%E8%B0%83%E5%BA%A6%E5%B9%B3%E5%8F%B0xxl-job%E3%80%8B
xxl-job由調(diào)度中心和執(zhí)行器兩部分組成樊展,調(diào)度中心負(fù)責(zé)任務(wù)的調(diào)度,執(zhí)行器負(fù)責(zé)執(zhí)行任務(wù)堆生。調(diào)度中心后臺(tái)专缠,支持配置任務(wù),控制任務(wù)淑仆,查看任務(wù)運(yùn)行日志等功能涝婉。

執(zhí)行器:任務(wù)的綁定的執(zhí)行器,任務(wù)觸發(fā)調(diào)度時(shí)將會(huì)自動(dòng)發(fā)現(xiàn)注冊(cè)成功的執(zhí)行器
描述:任務(wù)的描述信息蔗怠,便于任務(wù)管理
路由策略:當(dāng)執(zhí)行器集群部署時(shí)墩弯,提供豐富的路由策略,包括寞射,
第一個(gè):固定選擇第一個(gè)機(jī)器渔工;
最后一個(gè):固定選擇最后一個(gè)機(jī)器;
輪詢:執(zhí)行器循環(huán)執(zhí)行
隨機(jī):隨機(jī)選擇在線的機(jī)器
一致性HASH:每個(gè)任務(wù)按照Hash算法固定選擇某一臺(tái)機(jī)器桥温,且所有任務(wù)均勻散列在不同機(jī)器上
最不經(jīng)常使用:使用頻率最低的機(jī)器優(yōu)先被選舉
最近最久未使用:輪詢的倒序選用
故障轉(zhuǎn)移:按照順序依次進(jìn)行心跳檢測(cè)引矩,第一個(gè)心跳檢測(cè)成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度
忙碌轉(zhuǎn)移:按照順序依次進(jìn)行空閑檢測(cè),第一個(gè)空閑檢測(cè)成功的機(jī)器選定為目標(biāo)執(zhí)行器并發(fā)起調(diào)度
Cron:觸發(fā)任務(wù)執(zhí)行的Cron表達(dá)式
運(yùn)行模式:任務(wù)以JobHandler方式維護(hù)在執(zhí)行器端,需要結(jié)合“JobHandler”屬性匹配執(zhí)行器中任務(wù)
JobHandler:運(yùn)行模式為“Bean”時(shí)生效旺韭,對(duì)應(yīng)執(zhí)行器中新開發(fā)的JobHandler類@JobHandler注解自定義的value值
子任務(wù)Key:每個(gè)任務(wù)都擁有一個(gè)唯一的任務(wù)Key(任務(wù)Key可以從任務(wù)列表獲确彰铡),當(dāng)本任務(wù)執(zhí)行結(jié)束并且執(zhí)行成功時(shí)区端,將會(huì)觸發(fā)子任務(wù)Key所對(duì)應(yīng)的任務(wù)的一次主動(dòng)調(diào)度值漫。
阻塞處理策略:調(diào)度過于密集執(zhí)行器來(lái)不及處理時(shí)的處理策略,
單機(jī)串行:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后珊燎,調(diào)度請(qǐng)求進(jìn)入FIFO隊(duì)列并以串行方式運(yùn)行惭嚣;
丟棄后續(xù)調(diào)度:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù)悔政,本次請(qǐng)求將會(huì)將丟棄并標(biāo)記為失斖硗獭;
覆蓋之前調(diào)度:調(diào)度請(qǐng)求進(jìn)入單機(jī)執(zhí)行器后谋国,發(fā)現(xiàn)執(zhí)行器存在運(yùn)行的調(diào)度任務(wù)槽地,將會(huì)終止運(yùn)行中的調(diào)度任務(wù)并清空隊(duì)列,然后運(yùn)行本地調(diào)度任務(wù)失敗處理策略:
失敗告警:調(diào)度失敗時(shí)芦瘾,將會(huì)觸發(fā)失敗報(bào)警捌蚊,如發(fā)送報(bào)警郵件;
失敗重試:調(diào)度失敗時(shí)近弟,將會(huì)主動(dòng)進(jìn)行一次失敗重試調(diào)度缅糟,重試調(diào)度后仍然失敗將會(huì)觸發(fā)失敗告警。注意當(dāng)任務(wù)以failover方式路由時(shí)祷愉,每次失敗重試將會(huì)觸發(fā)新一輪路由窗宦;
執(zhí)行參數(shù):任務(wù)執(zhí)行所需的參數(shù),多個(gè)參數(shù)時(shí)用逗號(hào)分隔二鳄,任務(wù)執(zhí)行時(shí)將會(huì)把多個(gè)參數(shù)轉(zhuǎn)換為數(shù)組傳入
報(bào)警郵件:任務(wù)調(diào)度失敗時(shí)郵件通知的郵箱地址赴涵,支持配置多郵箱地址,配置多個(gè)郵箱地址時(shí)用逗號(hào)分隔

http://zhuanlan.51cto.com/art/201807/579064.htm

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末订讼,一起剝皮案震驚了整個(gè)濱河市髓窜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌欺殿,老刑警劉巖寄纵,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異脖苏,居然都是意外死亡擂啥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門帆阳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)哺壶,“玉大人屋吨,你說我怎么就攤上這事∩奖觯” “怎么了至扰?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)资锰。 經(jīng)常有香客問我敢课,道長(zhǎng),這世上最難降的妖魔是什么绷杜? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任直秆,我火速辦了婚禮,結(jié)果婚禮上鞭盟,老公的妹妹穿的比我還像新娘圾结。我一直安慰自己,他們只是感情好齿诉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布筝野。 她就那樣靜靜地躺著,像睡著了一般粤剧。 火紅的嫁衣襯著肌膚如雪歇竟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天抵恋,我揣著相機(jī)與錄音焕议,去河邊找鬼。 笑死弧关,一個(gè)胖子當(dāng)著我的面吹牛号坡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播梯醒,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腌紧!你這毒婦竟也來(lái)了茸习?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤壁肋,失蹤者是張志新(化名)和其女友劉穎号胚,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體浸遗,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猫胁,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了跛锌。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片弃秆。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出菠赚,到底是詐尸還是另有隱情脑豹,我是刑警寧澤,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布衡查,位于F島的核電站瘩欺,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拌牲。R本人自食惡果不足惜俱饿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望塌忽。 院中可真熱鬧拍埠,春花似錦、人聲如沸砚婆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)装盯。三九已至坷虑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間埂奈,已是汗流浹背迄损。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留账磺,地道東北人芹敌。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像垮抗,于是被迫代替她去往敵國(guó)和親氏捞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354

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