1. 程式人生 > >ServletContextListener 使用。web啟動監聽啟動和結束時的呼叫

ServletContextListener 使用。web啟動監聽啟動和結束時的呼叫

web.xml監聽配置
<!--此監聽是必須的。控制監聽請求作用域spring2.5之後都這樣配置-->
<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
  </listener>
  <!-- 下面自定義配置監聽,假如你只想在伺服器啟動和介紹時候呼叫請在這裡配置監聽器 -->
  <listener>
    <listener-class>XXXX.ContextDestroyListener</listener-class>
  </listener>


import java.sql.Driver;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Enumeration;
import java.util.List;
import java.util.Set;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;





public class ContextDestroyListener implements ServletContextListener {  
  
    private Logger logger = LoggerFactory.getLogger(getClass());
  
    public static final List<String> destoreyzji = Arrays.asList("qa", "qb");  
  // 初始化時候執行此函式,可以讀取配置什麼可以在這裡寫
    @Override  
    public void contextInitialized(ServletContextEvent sce) {  
        //Ignore  
    }  
  // 當銷燬的時候執行此函式
    @Override  
    public void contextDestroyed(ServletContextEvent sce) {  
        destroyJDBCDrivers();  
        destroySpecifyThreads();  
    }  
  
    private void destroySpecifyThreads() {  
        final Set<Thread> threads = Thread.getAllStackTraces().keySet();  
        for (Thread thread : threads) {  
            if (needManualDestroy(thread)) {  
                synchronized (this) {  
                    try {  
                        thread.stop();  
                        logger.debug(String.format("Destroy  %s successful", thread));  
                    } catch (Exception e) {  
                        logger.warn(String.format("Destroy %s error", thread), e);  
                    }  
                }  
            }  
        }  
    }  
  
    private boolean needManualDestroy(Thread thread) {  
        final String threadName = thread.getName();  
        for (String aaaa : destoreyzji) {  
            if (threadName.contains(aaaa)) {  
                return true;  
            }  
        }  
        return false;  
    }  
  
    private void destroyJDBCDrivers() {  
        final Enumeration<Driver> drivers = DriverManager.getDrivers();  
        Driver driver;  
        while (drivers.hasMoreElements()) {  
            driver = drivers.nextElement();  
            try {  
                DriverManager.deregisterDriver(driver);  
                logger.debug(String.format("Deregister JDBC driver %s successful", driver));  
            } catch (SQLException e) {  
                logger.warn(String.format("Deregister JDBC driver %s error", driver), e);  
            }  
        }  
    }  
}