** 什么時(shí)候重建任務(wù)隊(duì)列盟广?**
slave來取任務(wù)的時(shí)候沒有取到职辅,就會(huì)重建任務(wù)隊(duì)列
Slave取任務(wù)的時(shí)候會(huì)按照 優(yōu)先隊(duì)列 重試隊(duì)列 普通隊(duì)列的順序來取任務(wù)
**Slave來取任務(wù)的時(shí)候的操作这敬? **
首先從taskmanager中取一個(gè)任務(wù)娱两,如果取到任務(wù)键科,向taskmonitor來注冊(cè)任務(wù)(上邊的taskmonitor三個(gè)數(shù)據(jù)結(jié)構(gòu)都有記錄的),最后返回任務(wù)挠锥,如果沒有取到觸發(fā)重建任務(wù)隊(duì)列峭范。
taskmonitor監(jiān)控
Taskmonitor每隔一分鐘進(jìn)行一次slave心跳,獲取taskstate瘪贱,如果發(fā)現(xiàn)某個(gè)slave取走了任務(wù)至少5s鐘了還沒有taskstate(taskstate一般slave成功獲取到任務(wù)的時(shí)候就會(huì)生成)就認(rèn)為任務(wù)可能出錯(cuò)了(這樣判斷回不會(huì)有問題呢?如果網(wǎng)絡(luò)傳輸大于5s呢辆毡?如果判斷有問題菜秦,就有可能造成兩個(gè)slave取得同一個(gè)任務(wù)),這時(shí)候?qū)⑷蝿?wù)從monitor中刪除(Clientpool和Clientpool)舶掖,并重新加到重試隊(duì)列中球昨。當(dāng)對(duì)slave心跳的時(shí)候網(wǎng)絡(luò)異常,那么這種情況比較嚴(yán)重眨攘,將Clientpool中該ip下所有的任務(wù)移到重試隊(duì)列中去主慰,并刪除Clientpool該ip下的記錄,同時(shí)刪除taskItemPool中所有記錄鲫售,刪除clientConcurrentHashMap該ip的信息共螺,也就是從slave集群中移除該節(jié)點(diǎn)。
taskmanager
主要是用來管理任務(wù)隊(duì)列的情竹,我們?cè)趕pring配置文件里配置了一個(gè)任務(wù)隊(duì)列藐不,然后在初始化的時(shí)候會(huì)生成出來一個(gè)隊(duì)列組(group),里面不僅包含這個(gè)隊(duì)列還有對(duì)應(yīng)的優(yōu)先隊(duì)列和重試隊(duì)列秦效。