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。中间件

相关文章
相关标签/搜索