Tomcat 關閉鉤子

使用JAVA的過程當中,常常遇到程序啓動時初始化一下資源,或生成一下臨時文件,程序退出時要清除這些臨時文件,或者程序退出時執行一下必要的其餘操做。若是程序是經過咱們提供的關閉/退出按鈕正常退出的,一切還都好處理,可是若是用戶直接關閉虛擬機運行的窗口,那一切就會變的比較複雜。 php

好在java提供了一種優雅的方式去解決這種問題。使得關閉的善後處理的代碼能執行。java的關閉鉤子能確保老是執行,不管用戶如何終止應用程序。除非用戶kill,這個是個死穴。 html

java而言,虛擬機會對如下幾種操做進行關閉: java

(1)系統調用System.exit()方法 tomcat

(2)程序最後一個守護線程退出時,應用程序正常退出。 app

(3)用戶強行中斷程序運行,好比ctrl+c等其餘方式中斷java程序 ui

關閉鉤子的生成: this

1.建立Thread的子類 url

2.實現run方法,應用程序關閉時會調用該方法,不須要調用start方法 spa

3.在應用中實例化關閉鉤子類 線程

4.使用Runtime註冊關閉鉤子

下面是一個使用關閉鉤子的例子:

public class ShutDownHook extends Thread{ 
    public static void main(String[] args){ 
        Runtime.getRuntime().addShutdownHook(new ShutDownHook()); 
       for(int i=0;i<10;i++){ 
        System.out.println("i="+i); 
       if(i==4){ 
           System.exit(0); 
       } 
         try { 
             Thread.sleep(1000); 
       } catch (InterruptedException e) { 
       // TODO Auto-generated catch block e.printStackTrace(); 
       } 
       }
     } 
    public void run(){
       System.out.println("hook shutdown!");
    } 
 }

使用Runtime.getRuntime().addShutdownHook方法註冊鉤子後,程序在非正常關閉是會執行鉤子程序run方法中的相關代碼。

Tomcat中的關閉鉤子:

TomcatCatalina類中有一個鉤子內部類的定義:

protected class CatalinaShutdownHook extends Thread {
 public void run(){ 
  try {   
   if (getServer() != null) {  
    Catalina.this.stop(); 
   }  
   } catch (Throwable ex) {   
   log.error(sm.getString("catalina.shutdownHookFail"), ex);  
   } finally {  
   // If JULI is used, shut JULI down *after* the server shuts down  
   // so log messages aren't lost   
   LogManager logManager = LogManager.getLogManager();  
   if (logManager instanceof ClassLoaderLogManager) { 
   ((ClassLoaderLogManager) logManager).shutdown(); 
   } 
  } 
 }
}

鉤子程序由於是Catalina的內部類,因此它能夠調用Catalina類中的相關方法。其調用了stop方法用於關閉相關服務

Catalinastart方法中將鉤子進行了註冊:

if (useShutdownHook) {if (shutdownHook == null) {shutdownHook = new CatalinaShutdownHook();}Runtime.getRuntime().addShutdownHook(shutdownHook);

咱們知道Tomcat啓動時CatalinaStart方法會被調用,因此鉤子在tomcat啓動時就會被註冊到虛擬

相關文章
相關標籤/搜索