Spring Boot 项目优雅关闭(两种完善解决方案附带示例代码)

这篇具有很好参考价值的文章主要介绍了Spring Boot 项目优雅关闭(两种完善解决方案附带示例代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

Spring Boot 项目优雅关闭常用两种方案,一种是使用kill -2 和 -15 发送程序终止信号,另一种是使用spring-boot-actuator包提供一个优雅下线接口,这两种方案根据自己喜好来,万不得已别用kill -9就行,个人推荐第一种,对于Spring Boot 项目来说两种方法只是入口不同,最终关闭逻辑都是一样的,具体的逻辑会在接下来阐述。

一、Spring Boot 项目优雅关闭核心逻辑

只要是Spring项目无论是何种方法最终都是调用到Spring的AbstractApplicationContext.doClose() 方法来实现优雅关闭,这里介绍的两种方法只是入口不同而已,在后面方案中会详细介绍。

PS:Spring Boot版本 ≥ 2.0
不同版本可能实现不同不过最终都是调用到AbstractApplicationContext.doClose() 方法来实现的关闭。

二、方案原理和实现(这里不包含Tomcat优雅关闭在下面扩展中会有详细介绍)

方案一原理和实现示例(通过kill -2 和 -15 优雅关闭,这种方式SpringBoot是默认支持的)

kill -2 和 -15 是操作系统给该进程发送一个信号通知,告知应用主动关闭,应用可以监听并接收到信号,可以完成一些关闭回收等动作,然后自我停止,这些关闭信号并不是由spring感知,而是由java线程Signal Dispatcher监听,此线程将收到的信号交给JVM,JVM判断信号种类,如果是-2/-15等关闭类型,则交由java.lang.Shutdown完成关闭,关闭前会触发所有的shutdown hookRuntime.getRuntime().addShutdownHook() 可以添加自定义的 shutdown hook

在启动类SpringApplication中会调用自己的refreshContext方法,通过 SpringApplicationShutdownHook.addRuntimeShutdownHook() 方法调用 Runtime.getRuntime().addShutdownHook() 添加自定义的 shutdown hook,在进程接收到kill -2 或 -15 时触发。

springboot 优雅关闭,spring boot,后端,java,linux,运维
SpringApplicationShutdownHook实现了 Runnable 重写了run 方法,当进程接收到kill -2 或 -15 时触发执行关闭逻辑。
springboot 优雅关闭,spring boot,后端,java,linux,运维

演示

# 发送一个关闭信号通知
kill -15 pid

springboot 优雅关闭,spring boot,后端,java,linux,运维
这里可以看到数据源定时任务等工具的关闭日志,还会看到一个线程池的关闭日志,这个后面扩展中会详细说明。

方案二原理和实现示例(通过spring-boot-actuator提供优雅关闭接口)

spring-boot-actuator是一个应用监控框架同时也提供了SpringBoot优雅下线的接口,原理还是一样的最终会调用到AbstractApplicationContext.doClose() 方法来实现的关闭,也可以自己写一个接口去调用AbstractApplicationContext.doClose(),这个有兴趣可以自己实现。

代码实现

  • POM
        <!--    监控 版本同步spring-boot    -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
  • 配置文件
spring:
  lifecycle:
    # 优雅下线超时时间
    timeout-per-shutdown-phase: 1m
# 暴露 shutdown 接口
# 调用 curl -X POST http://127.0.0.1:18080/actuator/shutdown
management:
  server:
    ### 端口
    port: 18080
    ### 允许服务地址
    address: 127.0.0.1
  endpoint:
    ### 是否开启下线 默认关闭
    shutdown:
      enabled: true
  endpoints:
    web:
      exposure:
        ### 暴露接口
        include: shutdown

演示

springboot 优雅关闭,spring boot,后端,java,linux,运维
这里看到的效果和方案一是一样的,可以看到数据源定时任务等工具的关闭日志,只是执行线程变了,线程池关闭看扩展。

三、扩展

通过 @PreDestroy 注解关闭自定义线程池和其它自定义工具

@PreDestroy是Java规范JSR-250引入的注解,定义了对象的销毁工作,同一期规范中还有注解@Resource,Spring也支持了这些注解,会在Spring提供的一个后置处理器InitDestroyAnnotationBeanPostProcessor中调用的,当Spring容器销毁时会调用到@PreDestroy标记的方法,在这个方法中自行处理关闭逻辑即可。

springboot 优雅关闭,spring boot,后端,java,linux,运维

优雅关闭内嵌Tomcat

内嵌Tomcat会使用到TomcatWebServerTomcatWebServer提供了一个优雅关闭Tomcat的方法shutDownGracefully,如果不配置默认是直接关闭,需要在配置文件中配置server.shutdown = graceful 开启优雅关闭。
springboot 优雅关闭,spring boot,后端,java,linux,运维
springboot 优雅关闭,spring boot,后端,java,linux,运维
springboot 优雅关闭,spring boot,后端,java,linux,运维文章来源地址https://www.toymoban.com/news/detail-772590.html

到了这里,关于Spring Boot 项目优雅关闭(两种完善解决方案附带示例代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 如何优雅地在Spring Boot项目启动时初始化数据,让你的Web应用快人一步

    如何优雅地在Spring Boot项目启动时初始化数据,让你的Web应用快人一步

    🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 大多数Java Web应用程序中,项目在启动时都需要加载一些初始化数据,例如配置文件、数据库连接信息等。在Spring Boot中,我们可以通过将数据缓存到内存中来提高Web应用程序的性能。本篇博客旨在通过一个实例来介绍如

    2024年02月02日
    浏览(9)
  • Spring Boot 实现程序的优雅退出

    Spring Boot 实现程序的优雅退出

    🏷️ 个人主页 :牵着猫散步的鼠鼠  🏷️ 系列专栏 :Java全栈-专栏 🏷️ 个人学习笔记,若有缺误,欢迎评论区指正   目录 前言 优雅停机是什么 SpringBoot如何实现优雅停机 合理杀死进程 法一:配置设置SpringBoot优雅停机 法二:配置Tomcat 容器优雅停机 设置Tomcat 容器关闭

    2024年03月20日
    浏览(9)
  • Spring Boot进阶(45): Spring Boot 开发必备技能:如何优雅地返回统一结果包装!

            在实际的开发中,我们常常需要对 API 接口的返回结果进行统一的包装,以方便客户端的处理和异常情况的统一处理。例如,我们可能需要对 API 接口返回结果进行统一的格式处理,将所有的异常情况都转化为统一的错误类型,同时也可能需要对返回结果进行统一的加

    2024年02月07日
    浏览(10)
  • Spring Boot进阶(73):Spring Boot如何优雅地使用Feign进行服务间通信?

    Spring Boot进阶(73):Spring Boot如何优雅地使用Feign进行服务间通信?

            在分布式系统中,服务间通信是非常常见的情况。而Feign就是一个开源的Java HTTP客户端,可以帮助我们在Spring Boot应用中快速构建和使用HTTP客户端,方便实现服务间的通信。本文将介绍如何优雅地使用Feign进行服务间通信。         那么,具体如何实现呢?这将又

    2024年02月06日
    浏览(9)
  • Spring Boot3.x 使用SpringDoc生成接口文档-超级完善 + knife4jUI

    Spring Boot3.x 使用SpringDoc生成接口文档-超级完善 + knife4jUI

    在Springfox3.0停更的两年里,SpringBoot进入3.0时代, SpringFox出现越来越多的问题,最为明显的就是解析器的问题,已经在上文 中解释清楚,这里就不再赘述。 SpringDoc是Spring官方推荐的API,相信不会轻易停更。 SpringDoc有多个版本,如果你使用的是SpringBoot3.x,请确保SpringDoc的版本

    2024年02月04日
    浏览(5)
  • Spring Boot中如何编写优雅的单元测试

    单元测试是指对软件中的最小可测试单元进行检查和验证。在Java中,单元测试的最小单元是类。通过编写针对类或方法的小段代码,来检验被测代码是否符合预期结果或行为。执行单元测试可以帮助开发者验证代码是否正确实现了功能需求,以及是否能够适应应用环境或需求

    2024年02月11日
    浏览(9)
  • Spring Boot 优雅停止服务的几种方法

    Spring Boot 优雅停止服务的几种方法

    在使用Springboot的时候,都要涉及到服务的停止和启动,当我们停止服务的时候,很多时候大家都是kill -9 直接把程序进程杀掉,这样程序不会执行优雅的关闭。而且一些没有执行完的程序就会直接退出。 我们很多时候都需要安全的将服务停止,也就是把没有处理完的工作继续

    2024年02月10日
    浏览(6)
  • 如何在Spring Boot中优雅地进行参数校验

    在平时的开发工作中,我们通常需要对接口进行参数格式验证。当参数个数较少(个数小于3)时,可以使用 if ... else ... 手动进行参数验证。当参数个数大于3个时,使用 if ... else ... 进行参数验证就会让代码显得臃肿,这个时候推荐使用注解来进行参数验证。 在Java中,注解

    2024年01月17日
    浏览(5)
  • 优雅地处理参数传递:Spring Boot中的技巧

    优雅地处理参数传递:Spring Boot中的技巧

    目录 一:四种传参方式 1.1:在 URL 中传递参数 1.2:PathVariable 传递参数(Restful 风格) 1.3:在请求体中传递参数 1.4:在请求头中传递参数  二:文件上传接口测试  2.1 : test.java  三、@RequestParam 3.1 多个参数  3.2 单个参数  四、@PathVariable 4.1  单个参数  4.2  多个参数 五、@

    2024年02月05日
    浏览(8)
  • Spring Boot 优雅实现多租户架构,so easy~!

    多租户架构是指在一个应用中支持多个租户(Tenant)同时访问,每个租户拥有独立的资源和数据,并且彼此之间完全隔离。通俗来说,多租户就是把一个应用按照客户的需求“分割”成多个独立的实例,每个实例互不干扰。 更好地满足不同租户的个性化需求。 可以降低运维

    2024年02月09日
    浏览(7)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包