xxl job 執行器時間輪

2021-10-18 06:54:01 字數 1975 閱讀 1583

時間輪出自netty中的hashedwheeltimer,是乙個環形結構,可以用時鐘來模擬,鐘面上有很多bucket,每乙個bucket上可以存放多個任務,使用乙個list儲存該時刻到期的所有任務,同時乙個指標隨著時間流逝一格一格轉動,並執行對應bucket上所有到期的任務。任務通過取模決定應該放入哪個bucket。和hashmap的原理類似,newtask對應put,使用list來解決hash衝突。

以上圖為例,假設乙個bucket是1秒,則指標轉動一輪表示的時間段為8s,假設當前指標指向 0,此時需要排程乙個3s後執行的任務,顯然應該加入到(0+3=3)的方格中,指標再走3s次就可以執行了;如果任務要在10s後執行,應該等指標走完一輪零2格再執行,因此應放入2,同時將round(1)儲存到任務中。檢查到期任務時只執行round為0的,bucket上其他任務的round減1。

// 時間輪的資料結構

private

volatile

static map

> ringdata =

newconcurrenthashmap

<

>()

;// 存入時間輪

private

void

pushtimering

(int ringsecond,

int jobid)

ringitemdata.

add(jobid)

; logger.

debug

(">>>>>>>>>>> xxl-job, schedule push time-ring : "

+ ringsecond +

" = "

+ arrays.

aslist

(ringitemdata));

}

上面是處理儲存的方法,接下來通過注釋來表示,執行器怎麼執行的

//獲取當前時間(ms)

long nowtime = system.

currenttimemillis()

;// 獲取未來5s內需要執行的任務

list

schedulelist = xxljobadminconfig.

getadminconfig()

.getxxljobinfodao()

.schedulejobquery

(nowtime + pre_read_ms, prereadcount);if

(schedulelist != null && schedulelist.

size()

>0)

else

if(nowtime > jobinfo.

gettriggernexttime()

)}else

}// 3、update trigger info

for(xxljobinfo jobinfo : schedulelist)

}else

接下來用時間軸來解釋下執行器的執行條件

通過如上條件完成對小於5s內的所有任務的處理·

通過閱讀原始碼發現在臨界情況(極端量級)下存在任務漏排程或者不排程的情況,不知道其他排程器是否存在,如有錯誤敬請斧正

XXL Job執行器部署

xxl job執行器部署 配置執行器元件 configuration public class xxljobconfig private string adminaddresses value private string ip value private int port value privat...

xxl job 執行過程中報時間不同步錯誤!

場景 將不同機器的執行器註冊到排程器時由於不同的機器的系統時間存在誤差導致任務無法執行!報錯資訊如下 msg com.xxl.rpc.util.xxlrpcexception the timestamp difference between admin and executor exceeds th...

Docker部署xxl job 通用反射執行器

最近在公司寫一些job,公司使用的是spring boot提供的註解形式實現的。這樣在自測的時候很麻煩,而且測試提測的時候需要修改cron表示式 提交git jenkins打包重啟 查閱資料後決定選用任務排程平台,有很多優秀的任務排程平台,選擇xxl job是因為文件清晰 使用簡單 基於遠端rpc呼...