如何监听spring容器的停止

如何监听spring容器的停止,第1张

如何监听spring容器的停止

本文主要讲解三个问题: 1 使用Java编写 MapReduce 程序时,如何向map、reduce函数传递参数。 2 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map、reduce脚本传递参数。 3 使用Streaming编写MapReduce程序(C/C++, Shell, Python)时,如何向map、reduce脚本传递文件或文件夹。 (1) streaming 加载本地单个文件 (2) streaming 加载本地多个文件 (3) streaming 加载本地目录 (4) streaming编程时在mapreduce脚本中读 hdfs 文件 (5) streaming编程时在mapreduce脚本中读 hdfs 目录

我们想停掉一个spring的进程,一般通过kill命令完成,常用的命令如 kill -2 pid(ctrl + C) kill -9 pid kill -15 pid

kill -9 可以认为 *** 作系统从内核级别直接强行kill进程,对服务来说没有任何的准备时间和清场时间,直接被kill掉,且无法被监听。

kill -2 和 -15 则是 *** 作系统给该进程发送一个信号通知,告知应用主动关闭,应用可以监听并接收到信号,可以完成一些关闭回收等动作,然后自我停止。

准确来说,这些关闭信号并不是由spring感知,而是由java线程 Signal Dispatcher 监听,此线程将收到的信号交给JVM,JVM判断信号种类,如果是-2/-15等关闭类型,则交由 java.lang.Shutdown 完成关闭,关闭前会触发所有的shutdown hook。

Runtime.getRuntime().addShutdownHook() 可以添加自定义的shutdown hook。

关于jvm关闭详细的原理分析过程请参考 java进程关闭事件监听

spring在启动过程中也是通过 Runtime.getRuntime().addShutdownHook() 来注册hook回调。

SpringApplication

在 SpringApplication 的 run 方法中,会调用 refreshContext ,默认情况下会调用 context.registerShutdownHook()

AbstractApplicationContext

在 AbstractApplicationContext. registerShutdownHook() ,实现了添加shutdown hook,对应的回调实现为 doClose()

其中 发布ContextClosedEvent事件 是非常关键的一步,所有希望完成清场 *** 作的业务或组件都可以监听此事件来完成触发。

整个回收过程还是比较简单的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8074681.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-13
下一篇 2023-04-13

发表评论

登录后才能评论

评论列表(0条)

保存