多線程批量處理任務需要頻繁用http請求接口,任務跑了十幾天後忽然報錯500 error。
開始以爲是因爲頻率太快導致錯誤。因爲處理時間完成沒要求,所以決定對每個任務進行了延時500ms處理。
幾天後忽然又報錯Caused by: java.lang.NoClassDefFoundError: org/apache/http/impl/client/RequestWrapper
看到這個錯以爲是因爲http請求時候資源沒有及時釋放,然後在代碼裏面加入以下代碼
request.releaseConnection(); //釋放request
if (null != httpClient) {
HttpClientUtils.closeQuietly(httpClient); //關閉連接
}
if (null != response)
try {
response.close(); //關閉response
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
幾天後又報錯(爲什麼是幾天後才報錯,可能是重啓了服務的原因)
後發現http自己會釋放這些資源
以上都是彎路
然後延時去了,問題返回到報錯500和java.net.SocketException: Too many open files錯誤
<html>
<head><title>500 Internal Server Error</title></head>
<body bgcolor="white">
<center><h1>500 Internal Server Error</h1></center>
<hr><center>nginx/1.11.3</center>
</body>
</html>
細心一看中間層nginx已經報錯了。
查看nginx的error日誌發現問題
原來是open files參數設置過小1024不能滿足。
設置成10240後問題解決。
(技術水平有限,敬請指教。感恩!)