Quartz blocked 線上故障解決

2021-09-19 11:27:41 字數 1863 閱讀 6296

故障描述:

線上的job正常跑一段時間後就進入了blocked狀態,更新quartz版本仍無法解決

故障分析:

先說正常獲取、觸發任務執行的流程:

排程器執行緒執行的時候,首先從 triggers 表獲取狀態為 waiting 的將要發射的觸發器,然後條件更新狀態 trigger_state 的值為 acquired ,更新成功則表示搶占到了,否則可能是被其他排程器搶占。然後插入觸發器資訊及例項名到 fired_triggers 表。前面的更新與插入操作是在同乙個事務裡完成。

搶占到觸發器後,排程器執行緒等待觸發時間到來。

執行時間到來後,排程器執行緒首先會把 fired_triggers 表裡觸發器記錄的狀態更新為 executing ,如果任務允許併發執行,把 triggers 表裡的狀態更新為 waiting , paused 或 complete (不需要再執行的) ;如果任務不允許併發執行,還會把 triggers 表裡的狀態更新為 blocked 或 paused_blocked,這個更新是根據 任務名和任務所屬組名 而不是觸發器名稱和觸發器所屬組名 來更新的,這就解決了乙個任務有多個觸發器的併發問題;然後排程器執行緒會建立乙個執行環境來執行任務,以便在任務執行完成後更新觸發器的狀態。任務執行完成後,在乙個事務裡把 triggers 裡的觸發器狀態更新為 waiting,刪除 fired_triggers 表裡對應的記錄。

即狀態變化為:waiting->blocked->executing->waiting

分析線上job得出blocked原因:

1、job執行執行緒執行週期過長,下乙個執行任務週期到了,導致blocked。一般是業務過多或者http請求未設定超時時長

2、異常處理,導致一直失敗重試,可能導致blocked**如下

@override

protected void executeinternal(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception ....", jobexecutioncontext.gettrigger().getkey());

try catch (exception e)

}

如果runjob方法一直異常,這會一直throw exception,導致blocked。

解決方法:

一、控制job執行不會重疊,保證每個執行週期不會重疊。

1)、如果處理業務很多,可以用多執行緒的方式,並行處理,縮短執行時長。

2)、配置cron 表示式要注意避免執行週期交叉。

3)、如果使用http或者其他遠端呼叫的方法,一定要設定超時時長

二、異常一定要控制重試次數,**如下

@override

protected void executeinternal(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception ....", jobexecutioncontext.gettrigger().getkey());

try catch (exception e) exception, setrefireimmediately true", jobexecutioncontext.gettrigger().getkey());

integer result = (integer) jobexecutioncontext.get("result");

if (result == null || result < cronconfig.getretrycount())

}}

線上操作與線上問題排查實戰

一 了解機器連線數情況 問題 192.168.88.136的sshd的監聽埠是22,如何統計192.168.88.136的sshd服務各種連線狀態 time wait close wait established 的連線數。netstat an grep 192.168.88.136 22 awk ...

線上操作與線上問題排查實戰

一 了解機器連線數情況 問題 192.168.88.136的sshd的監聽埠是22,如何統計192.168.88.136的sshd服務各種連線狀態 time wait close wait established 的連線數。netstat an grep 192.168.88.136 22 awk ...

線上操作與線上問題排查實戰

問題 1.2.3.4的sshd的監聽埠是22,如何統計1.2.3.4的sshd伺服器各種連線狀態 time time wait close wait estestablestablishestablished 連線數。說明 netstat是追查網路連線問題的常用工具,結合grep awk使用。說明 ...