Spring Boot 应用如何优雅关闭

Spring Boot 优雅停止服务的几种方法 以上这几种方法实现的话比较简单,但是真实工作中还需要考虑的点还很多,比如需要保护暴露的点不被别人利用,一般要加一些防火墙,或者只在内网使用,保证程序安全。在真实的工作中的时候第三种比较常用,程序中一般使用内存队列或线程池的时候最好要优雅的关机,将内存队列没有处理的保存起来或线程池中没处理完的程序处理完。但是因为停机的时候比较快,所以停服务的时候最好不要处理大量的数据操作,这样会影响程序停止。 阅读详情

什么是优雅关闭

优雅关闭是指在关闭应用或服务时,执行一系列操作来确保数据的一致性和系统的稳定性。这些操作包括:

  • 停止接受新的请求
  • 等待所有正在处理的请求完成
  • 关闭所有连接和资源
  • 释放所有内存和 CPU 资源

优雅关闭可以避免数据丢失、程序崩溃等问题。

优雅关闭的重要性

优雅关闭对于应用和服务的高可用性至关重要。它可以确保在关闭应用或服务时不会丢失数据或中断正在进行的操作。

优雅关闭的实现方法

优雅关闭可以通过多种方式实现,包括:

  • 使用操作系统提供的关闭信号
  • 使用应用程序自身的关闭机制
  • 使用第三方库或框架

优雅关闭的示例

以下是一个使用 Java 实现优雅关闭的示例:

Java

public class GracefulShutdown {

    public static void main(String[] args) {
        // 创建一个线程池来处理请求
        ExecutorService executorService = Executors.newFixedThreadPool(10);

        // 接受新的请求
        while (true) {
            executorService.submit(() -> {
                // 处理请求
            });
        }

        // 优雅关闭
        executorService.shutdown();
        while (!executorService.isTerminated()) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

在这个示例中,我们使用 ExecutorService 来处理请求。在关闭应用时,我们首先关闭 ExecutorService,然后等待所有正在处理的请求完成。这样可以确保所有请求都能够正常完成,不会丢失数据。

如何优雅关闭 Spring Boot

优雅关闭 Spring Boot 应用是指在关闭应用时,不会中断正在处理的请求,并能正确释放资源。Spring Boot 提供了多种优雅关闭应用的方法:

1. 使用 Actuator

Actuator 是 Spring Boot 提供的一个管理端点,可以用于监控和管理 Spring Boot 应用。Actuator 提供了一个 /shutdown 端点,用于关闭应用。

要使用 Actuator 关闭应用,需要在应用的配置文件中添加以下配置:

management.endpoints.web.exposure.include=shutdown

配置完成后,可以通过 HTTP 请求 /shutdown 端点来关闭应用。例如,可以使用 curl 命令:

curl -X POST http://localhost:8080/shutdown

2. 使用自定义关闭钩子

Java 提供了 Runtime 类,用于注册关闭钩子。关闭钩子是在 JVM 退出时执行的代码。

可以使用自定义关闭钩子来优雅关闭 Spring Boot 应用。例如:

public class GracefulShutdown {

    public static void main(String[] args) {
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            // 关闭应用
        }));

        // 启动应用
    }
}

3. 使用 Spring Boot 生命周期事件

Spring Boot 提供了 ApplicationListener 接口,用于监听 Spring Boot 应用的生命周期事件。

可以使用 ApplicationListener 监听 ContextClosedEvent 事件,并在事件发生时执行优雅关闭操作。例如:

public class GracefulShutdownListener implements ApplicationListener<ContextClosedEvent> {

    @Override
    public void onApplicationEvent(ContextClosedEvent event) {
        // 关闭应用
    }
}

4. 使用 Spring Boot 2.3 的新功能

Spring Boot 2.3 引入了新的 server.shutdown 配置属性,用于控制应用关闭的行为。

设置 server.shutdown=graceful 后,Spring Boot 会在接收到关闭信号后,首先停止接受新的请求,然后等待所有当前正在处理的请求处理完成,最后再关闭应用。

server.shutdown=graceful

Spring Boot 提供了多种优雅关闭应用的方法。可以根据应用的具体需求选择合适的方法。

Spring Boot优雅关闭的底层实现是什么?

Spring Boot 优雅关闭的底层实现依赖于 Spring Boot Actuator 和 Tomcat 等嵌入式 Web 服务器的 生命周期 事件。

1. Spring Boot Actuator

Spring Boot Actuator 提供了一个 /shutdown 端点,用于关闭应用。当收到关闭请求时,Actuator 会触发 ContextClosedEvent 事件。

2. Tomcat 生命周期事件

Tomcat 等嵌入式 Web 服务器提供了 beforeStop() 和 afterStop() 等生命周期事件。

3. 优雅关闭流程

Spring Boot 优雅关闭的流程大致如下:

  1. 客户端向 /shutdown 端点发送关闭请求。
  2. Actuator 触发 ContextClosedEvent 事件。
  3. 应用程序监听器监听到 ContextClosedEvent 事件,并执行优雅关闭操作,例如:
    • 停止接收新的请求
    • 等待所有正在处理的请求完成
    • 关闭数据库连接
    • 释放资源
  4. Tomcat 触发 beforeStop() 事件,进行一些清理工作,例如:
    • 关闭连接器
    • 释放端口
  5. Tomcat 触发 afterStop() 事件,完成关闭操作。

4. 优雅关闭的配置

Spring Boot 默认情况下启用了优雅关闭功能。可以通过以下配置项进行调整:

  • server.shutdown: 控制关闭行为,可选值包括 immediate 和 graceful。
    • immediate: 立即关闭应用,不等待正在处理的请求完成。
    • graceful: 优雅关闭应用,等待正在处理的请求完成。
  • server.shutdown.timeout: 优雅关闭超时时间,单位为秒。

Spring Boot 优雅关闭的底层实现依赖于 Spring Boot Actuator 和 Tomcat 等嵌入式 Web 服务器的生命周期事件。通过监听 ContextClosedEvent 事件,应用程序可以执行优雅关闭操作,确保数据的一致性和系统的稳定性。

Spring Boot Actuator优雅关闭的底层实现跟系统的关系

Spring Boot Actuator 优雅关闭的底层实现与系统密切相关,主要体现在以下几个方面:

1. 操作系统信号

Spring Boot Actuator 依赖于操作系统提供的信号机制来触发优雅关闭。当收到 SIGTERM 或 SIGKILL 等信号时,Actuator 会触发 ContextClosedEvent 事件,并执行优雅关闭操作。

2. 线程池

Spring Boot 默认使用 Tomcat 线程池来处理请求。在优雅关闭过程中,Actuator 会停止接收新的请求,并等待所有正在处理的请求完成。这需要操作系统提供线程管理机制,以便能够控制线程的执行和销毁。

3. 文件句柄

在优雅关闭过程中,应用程序需要关闭所有打开的文件句柄。这需要操作系统提供文件管理机制,以便能够打开、关闭和管理文件句柄。

4. 内存管理

在优雅关闭过程中,应用程序需要释放所有占用的内存空间。这需要操作系统提供内存管理机制,以便能够分配、回收和管理内存空间。

5. 总结

Spring Boot Actuator 优雅关闭的底层实现依赖于操作系统提供的多种机制,包括信号机制、线程管理机制、文件管理机制和内存管理机制。这些机制对于保证优雅关闭的顺利进行至关重要。

以下是一些具体的例子:

  • SIGTERM 信号是操作系统提供的终止信号,它指示应用程序或服务应该正常关闭。Spring Boot Actuator 会监听 SIGTERM 信号,并在收到该信号时触发 ContextClosedEvent 事件,并执行优雅关闭操作。
  • Tomcat 线程池是操作系统提供的线程管理机制,它允许应用程序创建和管理线程。在优雅关闭过程中,Spring Boot Actuator 会停止接收新的请求,并等待所有正在处理的请求完成。这需要操作系统提供线程管理机制,以便能够控制线程的执行和销毁。
  • 文件句柄 是操作系统提供的文件管理机制,它允许应用程序打开、关闭和管理文件。在优雅关闭过程中,应用程序需要关闭所有打开的文件句柄。这需要操作系统提供文件管理机制,以便能够打开、关闭和管理文件句柄。
  • 内存空间 是操作系统提供的内存管理机制,它允许应用程序分配、回收和管理内存空间。在优雅关闭过程中,应用程序需要释放所有占用的内存空间。这需要操作系统提供内存管理机制,以便能够分配、回收和管理内存空间。

总之,Spring Boot Actuator 优雅关闭的底层实现与系统密切相关,依赖于操作系统提供的多种机制。这些机制对于保证优雅关闭的顺利进行至关重要。

Java微服务——如何优雅关闭 Spring Boot 应用 前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 应用呢?那就通过本文一起来探究吧。(本文主要针对基于Spring B... 阅读详情

相关推荐

Spring Boot 应用优雅关闭详解

在微服务和分布式系统的背景下,应用的启动和关闭变得尤为重要。尤其是在进行应用的部署、升级和维护时,如何优雅地关闭一个Spring Boot应用以确保所有正在进行的请求被妥善处理,变得至关重要。本文将详细介绍Spring Boot应用优雅关闭的概念、实现方法及其在实际应用中的意义和最佳实践。

fudaihb的博客 2345

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

Spring Boot 项目优雅关闭常用两种方案,一种是使用kill -2 和 -15 发送程序终止信号,另一种是使用spring-boot-actuator包提供一个优雅下线接口

kerwin的博客 1万+

优雅关闭Spring Boot应用程序:优雅地停止Spring Boot应用程序

使用Actuator可以通过发送HTTP请求来关闭应用程序,使用自定义的关闭钩子可以在应用程序关闭时执行特定的操作,而使用Spring Boot的生命周期事件可以监听应用程序的关闭事件并执行相应的操作。在开发Spring Boot应用程序时,如何优雅地关闭应用程序是一个常见的问题。通过Actuator,我们可以使用HTTP端点来执行各种管理操作,包括关闭应用程序。除了使用Actuator,我们还可以使用Java提供的Runtime类来注册一个自定义的关闭钩子,以在应用程序关闭时执行特定的操作。

YmsNet的博客 876

Spring boot 项目中如何优雅停止服务的五种方法,值得收藏!

=====第二种方法也比较简单,获取程序启动时的上下文,然后关闭主程序启动时的上下文。这样的程序在关闭的时候也会调用PreDestroy注解。如下方法在程序启动十秒后进行关闭。try {第三种===第一种方法,在springboot启动的时候将进程号写入一个app.pid文件,生成的路径是可以指定的,可以通过命令cat /Users/huangqingshi/app.id | xargs kill命令直接停止服务,这个时候bean对象的PreDestroy方法也会调用的。

2201_75604341的博客 4887

西安电子科技大学841学长经验分享(总成绩第三名)

西安电子科技大学841学长经验分享(总成绩第三名)

qq_30953547的博客 1083

ESP32-S3驱动PCA9685模块:I2C扩展16路舵机控制实战指南

本文提供了ESP32-S3通过I2C总线驱动PCA9685模块扩展16路PWM输出的完整实战指南。详细解析了PCA9685模块原理、硬件连接、I2C地址配置,并给出了核心驱动代码与角度控制函数,帮助开发者解决微控制器PWM引脚不足的问题,轻松实现多路舵机控制。

weixin_32005771的博客 523

Spring Boot 应用优雅关闭

写这篇文章是因为看到 “线程池在使用结束后应该正确关闭.” 那么如果我们的 Spring 应用都无法正确关闭, 那么线程池肯定也无从保障。

howeres的博客 566

机器人运动不流畅?手把手教你用ACCSET调整ABB/FANUC点位加速度

本文针对ABB和FANUC工业机器人运动不流畅、拐角抖动、到位震颤等常见问题,提供了详细的解决方案。核心在于使用ACCSET指令(ABB)或ACC选项(FANUC)调整机器人的点位加速度与减速度参数。文章通过实战案例与系统化调试流程,手把手指导工程师优化运动性能,实现平稳、精准的机器人运动控制。

gpu4optimizer的博客 284

如何优雅关闭 Spring Boot 应用

前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 应用呢?那就通过本文一起来探究吧。(本文主要针对基于Spring B...

lingqu+wx bjmsb06 286

华为OD机试真题 新系统2026-04-01 C语言 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 231

MTK Meta ISP 工具使用技巧与参数读取路径全解析

在联发科(MediaTek, MTK)平台上进行相机图像调试时,Meta ISP 工具是连接 PC 与设备进行参数调整、寄存器读取和图像输出的重要工具。本文以实战角度出发,系统梳理 Meta ISP 的使用流程、关键模块功能、典型调试技巧与参数读取路径,结合最新版平台(如MTK Genio/Dimensity 系列)架构,帮助工程师掌握联发科图像调优的核心流程。

努力分享一些人工智能、计算机视觉、影像等相关的知识干货! 1148

如何优雅的关闭基于Spring Boot 内嵌 Tomcat 的 Web 应用

背景 最近在搞云化项目的启动脚本,觉得以往kill方式关闭服务项目太粗暴了,这种kill关闭应用的方式会让当前应用将所有处理中的请求丢弃,响应失败。这种形式的响应失败在处理重要业务逻辑中是要极力避免的,所以我们需要一种更加优雅的方式关闭springBoot应用。 基本思路 首先我们关闭一个微服务应用可以分为两大步骤 关闭web应用服务器 关闭spring容器 我项目中使用的是内置的tomcat服...

weixin_47082274的博客 3349

MATLAB 与 STK 互联导出导弹轨迹及速度数据(csv导出)

本文介绍了如何通过 MATLAB 脚本连接 STK 提取导弹三维轨迹数据,并以 CSV 格式导出,包含以下关键内容:自动连接 STK 场景;获取所有导弹对象;提取 J2000 坐标系下的位置和速度;加入任务优先级与状态;导出为标准 CSV 文件;

weixin_52370774的博客 781

Spring Boot应用优雅关闭

在需要实现优雅关闭的应用工程中增加下述依赖:部分启动器默认就依赖了Actuator启动器,如:spring-cloud-starter-netflix-eureka-server,那么下述依赖是可以省略的。

风生的博客 705

Python爬虫实战:使用最新技术爬取GitHub Trending项目

本文将详细介绍如何使用Python最新技术栈构建一个高效的GitHub Trending爬虫。我们将使用异步请求库httpx、HTML解析库parsel、数据存储方案以及反反爬技术,完整实现一个能够稳定获取GitHub Trending数据的爬虫系统。文章包含5000余字详细教程,从环境搭建到代码实现,再到数据处理和存储,最后部署运行,提供全方位指导。GitHub Trending页面展示了GitHub上当前最受欢迎的项目,对于开发者了解技术趋势、发现优秀项目非常有价值。

2201_76125261的博客 738

简要介绍 | 雷达穿墙成像及其应用场景

本文简要介绍了雷达穿墙成像技术的原理、研究现状、挑战与未来展望,希望能为相关领域的研究与应用提供参考。具有广泛的应用前景。本文将详细介绍雷达穿墙成像的原理,以及其在不同应用场景中的实践。逆时偏移算法(Reverse-Time Migration, RTM)雷达穿墙成像技术是一种先进的遥感技术,具有。的能力,可用于探测室内目标。安全与救援、建筑结构检测等领域。雷达穿墙成像技术的核心原理是。是Green函数,表示从接收点。雷达穿墙成像及其应用场景。雷达穿墙成像及其应用场景。目标识别与定位准确性。

NLOS的博客 2233

Spring Boot应用优雅关闭机制与实践指南

在Java微服务架构中,应用生命周期管理是保障系统稳定性的关键技术。Spring Boot通过Shutdown Hook机制实现优雅关闭,其核心原理是注册JVM关闭钩子触发Spring容器的有序销毁流程。该技术能有效解决资源泄漏、数据不一致等生产环境常见问题,特别适用于需要处理数据库连接池释放、消息队列消费者退出的分布式场景。通过Actuator端点或JMX管理Bean等热词技术,开发者可以实现对应用关闭过程的精准控制。结合Kubernetes等容器平台的preStop钩子,能够构建从应用到基础设施的全链路

weixin_33462927的博客 85

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

优雅关闭 Spring Boot 应用

前言 随着线上应用逐步采用 SpringBoot 构建,SpringBoot应用实例越来多,当线上某个应用需要升级部署时,常常简单粗暴地使用 kill 命令,这种停止应用的方式会让应用将所有处理中的请求丢弃,响应失败。这样的响应失败尤其是在处理重要业务逻辑时需要极力避免的,那么有什么更好的方式来平滑地关闭 SpringBoot 应用呢?那就通过本文一起来探究吧。(本文主要针对基于Spring B...

gw的博客 277

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

优雅关闭Spring Boot应用

文章目录官方介绍代码测试小结 最新的Spring Boot添加了一个新特性 — 优雅停机。 官方介绍 官方文档地址:https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#boot-features-graceful-shutdown 这个机制会有一个超时时间,该超时时间提供一个宽限期,在此宽限期内,现有请求将被允许完成,而新请求将不被允许。 不允许新请求的确切方式因所使用的Web服务器而异。 Jetty,Reactor N

分享技术,分享生活 1719

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Spring Boot应用优雅关闭实践与优化方案

在分布式系统架构中,应用的优雅关闭(Graceful Shutdown)是确保数据一致性和系统稳定性的关键技术。其核心原理是通过生命周期钩子机制,在接收到终止信号时有序停止接收新请求、完成进行中的任务并释放资源。该技术能有效避免强制终止导致的事务中断、消息丢失等数据一致性问题,尤其适用于微服务、消息队列、数据库连接池等关键组件场景。本文以Spring Boot框架为例,深入解析了包括SmartLifecycle接口、Shutdown Hook、PreDestroy注解等实现方式,并针对HikariCP连接池

weixin_29234509的博客 179
上一篇: 分布式事务及解决方案
下一篇: ThreadLocal是什么?
byteinit
博客等级 码龄17年 326粉丝 65原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值