目录

概念

原理

SpringBoot实现源码分析

查看源码我们发现会调用 Lifecycle 的stop()方法  或者调用 SmartLifecycle的stop(Runnable var1)方法且

isRunning()为ture才会被调用

结论


概念

jvm有shutdownHook机制,中文习惯叫优雅退出。相当于在linux系统中执行SIGTERM(kill -15 或者 svc -d)时退出前执行的一些操作.

原理

以linux系统为例说明:

进程在响应kill -15 pid命令进行关闭操作时默认发送SIGTERM信号至指定进程/进程组。如果进程没有捕获该信号的逻辑,则SIGTERM的作用是终止进程。而registerShutdownHook=true说明有注册的事件需要捕获该信号,先执行相应的逻辑再进行终止。

SpringBoot实现源码分析

查看SpringApplication类源码,registerShutdownHook属性默认是true,刷新上下文的时候会调用上下文的registerShutdownHook方法

查看registerShutdownHook方法的实现 AbstractApplicationContext-registerShutdownHook,我们发现会初始化

shutdownHook线程并注册一个jvm的shutdownHook钩子函数。jvm退出前会执行这个钩子函数。

doclose做了什么,查看源码,我们发现会调用lifecycleProcessor的onclose方法。

lifecycleProcessor是什么,查看源码,其实就是DefaultLifecycleProcessor

DefaultLifecycleProcessor-onClose() 方法做了什么

查看源码我们发现会调用 Lifecycle 的stop()方法  或者调用 SmartLifecycle的stop(Runnable var1)方法且

isRunning()为ture才会被调用

结论

所以要实现SpringBoot优雅退出只要实现Lifecycle接口的 -stop()或 SmartLifecycle 接口的stop(Runnable var1)方法就可以。

test验证

@Component
public class LifecycleTest implements Lifecycle {@Overridepublic void start() {}@Overridepublic void stop() {System.out.println("LifecycleProcessorTest stop()");}@Overridepublic boolean isRunning() {return true;}
}

2019-06-27 13:23:08.493 INFO 50993 --- [ Thread-21] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@45ca843: startup date [Thu Jun 27 13:22:52 CST 2019]; root of context hierarchy
2019-06-27 13:23:08.499 INFO 50993 --- [ Thread-21] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 0
LifecycleProcessorTest stop()
2019-06-27 13:23:08.499 INFO 50993 --- [ Thread-21] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
2019-06-27 13:23:08.501 INFO 50993 --- [ Thread-21] o.s.s.c.ThreadPoolTaskScheduler : Shutting down ExecutorService 'taskScheduler'

SpringBoot优雅退出相关推荐

  1. java 定时任务怎么关闭_浅谈springboot项目中定时任务如何优雅退出

    在一个springboot项目中需要跑定时任务处理批数据时,突然有个Kill命令或者一个Ctrl+C的命令,此时我们需要当批数据处理完毕后才允许定时任务关闭,也就是当定时任务结束时才允许Kill命令生 ...

  2. SpringBoot 优雅停机

    目录 linux常用的 kill 指令 springboot 优雅停机 /actuator/shutdown 端点 不停机更新方案 linux常用的 kill 指令 kill -15:kill指令默认 ...

  3. SpringBoot优雅编码之:Lombok加持

    概述 Lombok 通过提供简单的语法注解形式来帮助简化消除一些必须有但显得很臃肿的 java 代码.典型的是对于 POJO对象的简化(如自动帮我们生成Setter和Getter等),有了Lombok ...

  4. SpringBoot - 优雅的实现【业务校验】高级进阶

    文章目录 Pre 需求 实现三部曲 实体类 Step1 搞两个自定义注解 Step2 搞自定义校验器 Step3 搞验证 小结 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  5. SpringBoot - 优雅的实现【参数分组校验】高级进阶

    文章目录 Pre 需求 实现三部曲 Step1 定义分组接口 Step2 给参数分配分组 Step3 指定分组 Step4 验证 源码 Pre SpringBoot - 优雅的实现[参数校验]高级进阶 ...

  6. SpringBoot - 优雅的实现【自定义参数校验】高级进阶

    文章目录 Pre 概述 三部曲 Step1 搞自定义注解 Step2 搞校验逻辑 Step3 使用 Step4 验证 附 int 类型的判断 源码 Pre SpringBoot - 优雅的实现[参数校 ...

  7. SpringBoot - 优雅的实现【参数校验】高级进阶

    文章目录 Pre 概述 参数校验三部曲 Step1 搞依赖 Step2 搞参数校验的实体类 常用的校验注解 Step3 开始验证 存在的问题 使用 统一格式 + 全局异常Handler 优化 源码 P ...

  8. .NET Worker Service 作为 Windows 服务运行及优雅退出改进

    上一篇文章我们了解了如何为 Worker Service 添加 Serilog 日志记录,今天我接着介绍一下如何将 Worker Service 作为 Windows 服务运行. 我曾经在前面一篇文章 ...

  9. .NET Worker Service 如何优雅退出

    上一篇文章中我们了解了 .NET Worker Service 的入门知识[1],今天我们接着介绍一下如何优雅地关闭和退出 Worker Service. Worker 类 从上一篇文章中,我们已经知 ...

最新文章

  1. Python 扩展 Op
  2. :未来5-10年,NLP将走向成熟
  3. G List it all
  4. linux vmcore 分析,crash分析vmcore
  5. excel连接mysql 数据库
  6. oracle中保留2位小数的写法
  7. JS各种各样的拖动效果
  8. MVC html 控件扩展【转载】
  9. ValueError: setting an array element with a sequence.
  10. secureCRT下载地址,亲测有效
  11. Solidworks CAM入门教程,简单生成雕刻机刀路,经验分享
  12. vue将图片保存到相册_Vue保存当前页面为图片
  13. 迪文串口屏幕通信问题
  14. keras调试的正确打开方式: 一句话让你把tensorflow当pytorch用
  15. 微信小程序获取手机号登录流程
  16. 周记一:要有一颗屹立不倒的恒心
  17. 进制详解:二进制、八进制和十六进制
  18. 一级建造师资格审核需要提交哪些材料?
  19. 【Chrome 浏览器自带谷歌翻译用不了】
  20. “全民来答题”用户协议

热门文章

  1. xml、json、url的一些简单介绍
  2. linux 挂载 nfs 权限,救急:nfs挂载问题
  3. 参加计算机能力培训计划,计算机技能 培训计划.doc
  4. html中的disabled属性的使用方式
  5. 营业执照办理流程是怎样的?
  6. [论文写作]论文查重——如何选择查重系统
  7. 媲美掘金App大图浏览效果,你确定不看一下?
  8. 「趣味连连看经典版」童年经典火影忍者连连看,无需下载,在线可玩~
  9. 大数据系列 -- 用户流失率计算
  10. Kuberntes部署MetalLB负载均衡器