Motan源碼閱讀--ShutDownHook使用

任何一箇中間件系統,都須要有個「平滑部署,平滑下線」的功能。 若是基於Java開發,每每採用ShutDownHook去作這件事情。 好比咱們在tomcat關閉時,註冊ServletContextListener,在上下文銷燬時,進行ShutDownHook調用。tomcat

public class ShutDownHookListener implements ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ShutDownHook.runHook(true);
    }
}

咱們啓動一個單獨的線程去作後面的清理動做。網絡

public class ShutDownHook extends Thread

咱們清理的目標是一個集合對象:jvm

private ArrayList<closableObject> resourceList = new ArrayList<closableObject>();

經過遍歷集合,一個個close對應的資源。 在資源close以後咱們清空這個集合:ide

resourceList.clear();

那麼這個resourceList集合中究竟有什麼東西呢? 咱們能夠放入任何咱們能夠進行資源回收的東西進去,好比io連接,網絡資源,線程池。線程

好比咱們在類中建立定時執行線程池,咱們能夠把這個線程池註冊到咱們要回收的集合中:code

ShutDownHook.registerShutdownHook(new Closable() {
            @Override
            public void close() {
                if (!executorService.isShutdown()) {
                    executorService.shutdown();
                }
            }
        });

這樣咱們能夠讓這個心跳上報線程,完成他的上報使命後,在退出jvm。中間件

相關文章
相關標籤/搜索