安全地關閉 jvm(tomcat中止鉤子事件處理)

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

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

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

然而,若是可以在關閉 jvm 時等待正在運行的任務執行完後再中止,正好能夠避免上述狀況的發生。sql

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

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.tomcat

//安全刪除註冊的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();
                    }
                }
            });
相關文章
相關標籤/搜索