任何一箇中間件系統,都須要有個「平滑部署,平滑下線」的功能。 若是基於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。中間件