天天看點

quartz卡死

這兩天遇到個quartz定時任務卡死的問題,記錄如下。

用戶端用quartz 寫了幾個定時任務(HttpURLConnection),去定時 從伺服器 同步消息。但運維的兄弟說,重新開機了伺服器,有兩個定時任務死了。

檢視日志,發現8這一個線程,确實卡死了。其他的則報了請求失敗的異常。

quartz卡死

我打開intellij調試,發現無論我如何停止服務,重新開機伺服器後, 用戶端都能自動連上。剛開始 我懷疑是HttpURLConnection沒有寫逾時傳回,導緻的。

從伺服器裡面,寫了個sleep,發現确實不會斷線重連,導緻卡死。

但想不明白,為什麼我這裡不能重制。再有如果卡死的話,應該是所有的定時任務都卡死,為什麼有的沒卡死呢?

後來通過仔細詢問,發現運維的重新開機方式是關機重新開機,而不是去服務裡面重新開機。仿真了一下,确實卡死了。接下來的的問題,就好分析了。

卡死确實發生在了,HttpURLConnection這。至于為什麼有的卡死,有的沒卡死,則是因為,卡死的任務,時間間隔短(卡死機率大),未卡死的時間間隔長(卡死機率小)。

HttpURLConnection有兩個逾時,一個是連接配接逾時,一個是讀資料逾時。當重新開機的時候,如果任務已經連接配接上了,但是讀資料時,伺服器斷開了,就會導緻Quartz死等。

如果電腦完全關閉後,用戶端的定時任務再觸發,就會因為無法連通 包HTTP請求失敗,不會導緻卡死。

手動設定逾時時間,問題解決。

HttpURLConnection urlCon = (HttpURLConnection)url.openConnection();

urlCon.setConnectTimeout(30000);

urlCon.setReadTimeout(30000);