详解如何在SpringBoot中实现优雅关闭

 更新时间:2024年09月06日 09:02:44   作者:码到三十五  
这篇文章主要介绍了如何在SpringBoot中实现优雅关闭,SpringBoot应用程序的关闭可以是崩溃,也可以是手动关闭的,Shutdown、Crash 和 Graceful 之间的区别在于,它控制决定了我们可以用这个事件做什么,本文中,一起研究下Spring Boot提供的开箱即用功能之一:优雅关闭

本文中,一起研究下Spring Boot提供的开箱即用功能之一:“优雅关闭”。

在了解什么是优雅关闭和如何关闭之前,了解我们需要处理优雅关闭的不同情况非常重要。

正常关机的要求

SpringBoot应用程序的关闭可以是崩溃,也可以是手动关闭的。

你可能想知道我们什么时候需要手动关闭它。此要求出现在许多事件中,其中包括:

  • 当我们因任何维护活动而关闭服务时。
  • 当我们执行更新部署时。

上述情况下,要么终止进程,要么使用Spring B

oot Actuator 提供的关闭方法实现进程终止。

什么是优雅关闭

Shutdown、Crash 和 Graceful 之间的区别在于,它控制决定了我们可以用这个事件做什么。按照我们的期望,Spring Boot应该为我们提供一种处理此事件的方法,这样我们就可以确保良好的资源管理(清理资源、释放锁和连接)。

让我们看看 Spring Boot 提供什么。

实现优雅关机

Spring Boot 2.3 版在 application.properties 中引入了一些设置,有助于实现优雅关闭。让我们看看这些属性。

# application.properties
server.shutdown = graceful

使用此设置,当停止服务器时,它将不会接受新请求,从而确保关闭过程顺利进行。默认情况下,它将等待 30 秒以等待任何待处理的请求完成。

可以控制这个时间吗?Spring Boot 提供了另一个属性,我们可以用它来控制关机过程的时间量。

#application.properties
spring.lifecycle.timeout-per-shutdown-phase=1m

通过此设置,Spring Boot 将等待 1 分钟才完成关闭过程。

让我们看看如何向SpringBoot 应用程序添加关闭方法。

启用关闭方法

需要添加以下依赖来为 Spring Boot 应用程序启用执行器。

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

到目前为止,我们已经了解了如何使用 Spring Boot 应用程序实现正常关闭。最后一点,我想谈谈另一个案例,即处理关闭事件。

处理关闭事件

import org.springframework.context.ApplicationEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class ShutdownListener implements ApplicationListener<ApplicationEvent> {

    @Override
    public void onApplicationEvent(ApplicationEvent event) {
        if (event instanceof ContextClosedEvent) {
            // Handle shutdown event
            System.out.println("Application is shutting down...");
            // Perform cleanup tasks or any necessary operations before shutdown
        }
    }
}

到此这篇关于详解如何在SpringBoot中实现优雅关闭的文章就介绍到这了,更多相关SpringBoot实现优雅关闭内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • ZooKeeper开发实际应用案例实战

    ZooKeeper开发实际应用案例实战

    这篇文章主要为大家介绍了ZooKeeper开发的实际应用案例实战,文中附含详细开发应用源码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2022-01-01
  • java编程实现国际象棋棋盘

    java编程实现国际象棋棋盘

    这篇文章主要为大家详细介绍了java编程实现国际象棋棋盘,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • SpringBoot中YAML配置文件实例详解

    SpringBoot中YAML配置文件实例详解

    前面一直在使用properties配置文件,spring boot也支持yaml配置文件,下面这篇文章主要给大家介绍了关于SpringBoot中YAML配置文件的相关资料,需要的朋友可以参考下
    2023-04-04
  • Java并发之不可思议的死循环详解

    Java并发之不可思议的死循环详解

    下面小编就为大家带来一篇Java并发之不可思议的死循环详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-01-01
  • mybatis批量插入返回主键失败的坑及解决

    mybatis批量插入返回主键失败的坑及解决

    这篇文章主要介绍了mybatis批量插入返回主键失败的坑及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Spring Cache用法及常见问题解决方案

    Spring Cache用法及常见问题解决方案

    Spring Cache用法很简单,但你知道这中间的坑吗?今天我以一个亲身经历者的角度,系统的讲解SpringCache的用法,并且举例介绍使用SpringCache遇到的常见问题,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • mybatis整合ehcache做三级缓存的实现方法

    mybatis整合ehcache做三级缓存的实现方法

    ehcache是一个快速内存缓存框架,java项目里用起来很方便,下面这篇文章主要给大家介绍了关于mybatis整合ehcache做三级缓存的实现方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-06-06
  • Spring @Transactional事务失效的原因分析

    Spring @Transactional事务失效的原因分析

    一个程序中不可能没有事务,Spring中,事务的实现方式分为两种:编程式事务和声明式事务。日常项目中,我们都会使用声明式事务 @Transactional来实现事务,本文来和大家聊聊什么情况会导致@Transactional事务失效
    2022-09-09
  • Java中 equals 重写时为什么一定也要重写 hashCode

    Java中 equals 重写时为什么一定也要重写 hashCode

    这篇文章主要介绍了Java中 equals 重写时为什么一定也要重写 hashCode,equals 方法和 hashCode 方法是 Object 类中的两个基础方法,它们共同协作来判断两个对象是否相等,所以之间到底有什么联系呢,接下来和小编一起进入文章学习该内容吧
    2022-05-05
  • Java幂等性的4种解决方案实战讲解(附通俗案例)

    Java幂等性的4种解决方案实战讲解(附通俗案例)

    幂等性应该是合格程序员的一个基因,在设计系统时,是首要考虑的问题,尤其是在像支付宝,银行,互联网金融公司等涉及的都是钱的系统,这篇文章主要介绍了Java幂等性的4种解决方案的相关资料,需要的朋友可以参考下
    2025-07-07

最新评论