任何一个中间件系统,都须要有个“平滑部署,平滑下线”的功能。 若是基于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。中间件