ShutdownHook - Java 优雅停机解决方案
想象一下,如果你现在刚好在 word 上写需求文档,电脑突然重启。等待开机完成,你可能会发现写了一个小时文档没有保存,就这么没了。。。 一个正在运行 Java 应用如果突然将其停止,影响不止数据丢失,还会造成其他影响。比如:
所以在关闭服务之前,我们需要先做好善后工作,比如保存数据,清理资源,下线服务,然后才退出应用。这种有计划平滑的关闭应用相对直接停止应用,就显得非常『优雅』。
ShutdownHookJava 语言提供一种 ShutdownHook(钩子)进制,当 JVM 接受到系统的关闭通知之后,调用 ShutdownHook 内的方法,用以完成清理操作,从而平滑的退出应用。 ShutdownHook代码如下: Runtime.getRuntime().addShutdownHook(new Thread(() -> { System.out.println("关闭应用,释放资源"); }));
目前很多开源框架都是基于这个机制实现优雅停机,比如 Dubbo,Spring 等。 相关注意点ShutdownHook 代码实现起来相对简单,但是我们还是需要小心下面这些坑。
我们可以多次调用 所以尽量在一个 ShutdownHook 完成所有操作。 ShutdownHook 需要尽快执行结束 不要在 ShutdownHook 执行需要被阻塞代码,如 I/0 读写,这样就会导致应用短时间不能被关闭。 Runtime.getRuntime().addShutdownHook(new Thread(() -> { while (true){ System.out.println("关闭应用,释放资源"); } })); 上面代码中,我们使用 除了阻塞之外,还需要小心其他会让线程阻塞的行为,比如死锁。 为了避免 ShutdownHook 线程被长时间阻塞,我们可以引入超时进制。如果等待一定时间之后,ShutdownHook 还未完成,由脚本直接调用 kill -9 强制退出或者 ShutdownHook 代码中引入超时进制。 文章首发于studyidea.cn/shutdownHook
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |