隨記:安全地關閉 jvm(tomcat停止鉤子事件處理)

在jvm中,java.lang.Runtime 有一個方法,public void addShutdownHook(Thread hook) {},此方法始於jdk1.3,用於在jvm關閉時執行一些命令。
參數是一個線程類,所以我們創建Thread對象並重寫run方法即可。

這裏說一下使用到的地方。

假如後臺有定時任務在運行,或者觸發事件。只要是有長時運行的任務,在jvm關閉時都會停止。這可能會導致一些數據的不正常等等問題。需要做數據校驗之類的一系列處理方法。

然而,如果能夠在關閉 jvm 時等待正在運行的任務執行完後再停止,正好可以避免上述情況的發生。

在生成對象,或者啓動時,在有必要的地方添加如下代碼,run方法中寫上需要在關閉jvm時執行的代碼即可。

    private void addStopHook() {
        Runtime.getRuntime().addShutdownHook(new Thread() {
            @Override
            public void run() {
                if (thread != null) {
                    logger.info("careful, we are closing canal thread");
                    hookStop();//停止實時索引
                }
            }
        });
    }

當遇到 mysql 驅動問題時,可按如下方式關閉
十二月 28, 2015 4:15:58 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesJdbc
嚴重: The web application [/elasticsearch] registered the JDBC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.
十二月 28, 2015 4:15:58 下午 org.apache.catalina.loader.WebappClassLoaderBase clearReferencesThreads
嚴重: The web application [/elasticsearch] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak.

//安全刪除註冊的mysql驅動
Class.forName("com.mysql.jdbc.Driver", true, ClassUtils.getDefaultClassLoader());
            Runtime.getRuntime().addShutdownHook(new Thread() {
                @Override
                public void run() {
                    try {
                        logger.info("unregister mysql driver");
                        while (DriverManager.getDrivers().hasMoreElements())
                            DriverManager.deregisterDriver(DriverManager.getDrivers().nextElement());
                            // AbandonedConnectionCleanupThread.shutdown();//5.1.25版本開始需要使用,否則在tomcat關閉時會有錯誤
                    } catch (Throwable e) {
                        e.printStackTrace();
                    }
                }
            });
發佈了91 篇原創文章 · 獲贊 73 · 訪問量 68萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章