我有一個在Ubuntu 16.04 LTS上運行的Java應用程序。關閉線程在執行端點呼叫時消失
當應用程序接收到關閉信號,停止序列像這樣運行:
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
shutdown();
}
});
這工作得很好,但只要我嘗試調用外部REST端點(我用的改造,其中Rx Observable)線程完全消失,端點永遠不會被調用,並且連續的命令不再被執行。
- 我首先想到Observables會是問題,並使用改造
Call
來代替。同樣的問題。 - 然後我嘗試進行同步調用,而不是調用端點異步。同樣的問題。
- 關機時間不是問題。我明確地給了30秒。
我認爲這與線程有關,當一個庫在關閉時創建額外的線程時,JVM似乎會殺死所有內容。
任何人都可以擺脫光線或建議我可以嘗試什麼,請。
-
額外信息:
我需要執行長期運行的清理。問題是我無法確定關閉信號是如何看起來像什麼時候發生的,因爲JVM運行在一個Docker容器中,該容器在docker stop
(當主機停止時)首先發送SIGTERM
,然後在超時之後(我可以設置,目前60秒)SIGKILL
。容器中的JVM運行socket.io,可以連接數千個客戶端。我希望使用60秒向每個客戶端發送good-bye
,並乾淨地斷開這些連接,並從負載均衡器註銷服務器。所以在清理過程中有很多潛在的阻塞操作。
如果你的Java認爲,清理總是短暫的,那麼Java是錯誤的:(
關閉掛鉤應儘快退出,並且肯定不參與網絡操作。看到Javadoc。 – EJP