任何一个中间件系统,都需要有个“平滑部署,平滑下线”的功能。 如果基于Java开发,往往采用ShutDownHook去做这件事情。 比如我们在tomcat关闭时,注册ServletContextListener,在上下文销毁时,进行ShutDownHook调用。
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
我们清理的目标是一个集合对象:
private ArrayList<closableObject> resourceList = new ArrayList<closableObject>();
通过遍历集合,一个个close对应的资源。 在资源close之后我们清空这个集合:
resourceList.clear();
那么这个resourceList集合中究竟有什么东西呢? 我们可以放入任何我们可以进行资源回收的东西进去,比如io链接,网络资源,线程池。
比如我们在类中创建定时执行线程池,我们可以把这个线程池注册到我们要回收的集合中:
ShutDownHook.registerShutdownHook(new Closable() { @Override
public void close() { if (!executorService.isShutdown()) {
executorService.shutdown();
}
}
});
这样我们可以让这个心跳上报线程,完成他的上报使命后,在退出jvm。