在实际应用中是如何停止一个 进程呢?

kill

通过该命令发送一个关闭信号给到jvm, 然后就开始执行 Shutdown Hook 了,你可以做很多:

1、 关闭 socket 链接

2、 清理临时文件

3、 发送消息通知给订阅方,告知自己下线

4、 将自己将要被销毁的消息通知给子进程

5、 各种资源的释放

所谓 优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做好一些善后操作,比如:关闭线程、释放连接资源等。

再比如,就是不会让调用方的请求处理了一增,一下就中断了。而处理完本次后,再停止服务。

Java语言中,我们可以通过:

Runtime.getRuntime().addShutdownHook()

方法来注册钩子,以保证程序平滑退出。

现在我们都是使用 Springoot 进行开发了,其实 SpringBoot 也提供了容器销毁的一个回调, ApplicationContextClosedEvent .除此之外, 还可以监听内嵌 Tomcat 的关闭事件.

需要注意的是,上述的关闭钩子,并不能响应 下面个kill 命令

kill

kill -9 相当于一次系统宕机,系统断电。这会给应用杀了个措手不及,没有留给应用任何反应的机会。

所以,无论如何是优雅不起来了。