《学会 SpringBoot · 优雅停机方案》

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗
🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 优雅停机
      • 技术简介
      • 实现步骤
      • 自定义方式
    • 总结陈词

CSDN.gif


优雅停机

技术简介

在 Spring Boot 中,“优雅停机”(Graceful Shutdown)指的是在应用程序关闭时,能够优雅地处理正在进行的请求和任务,而不是强制立即终止。这种机制可以确保在应用程序关闭时,现有的请求能够被处理完毕,避免数据丢失或请求失败。

优雅停机的特点

  • 处理现有请求:在接收到关闭信号后,应用会停止接收新的请求,但会继续处理已经接收到的请求。
  • 可配置的超时:可以配置一个超时时间,在这个时间内,应用会尝试完成所有正在进行的请求。如果超时后仍有请求未完成,应用会强制关闭。
  • 资源清理:在关闭过程中,可以执行一些清理操作,比如关闭数据库连接、释放资源等。

支持的版本
优雅停机功能在 Spring Boot 2.3 中首次引入,并在后续版本中得到了增强和改进。Spring Boot 3 继续支持和优化这一特性。


实现步骤

Step1、添加依赖:首先确保你的Spring Boot项目中包含了Spring Boot Actuator的依赖。

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

Step2、启用端点:默认情况下,ShutdownEndpoint是禁用的。你需要在application.properties或application.yml文件中启用它。

# 很多资料仅配置shutdown,会提示 No static resource actuator/shutdown
management:endpoints:# 暴露所有端点信息,设置为false比较安全,端点需要的单独打开enabled-by-default: true#以web方式暴露web:exposure:include: '*'

Step3、使用端点:一旦启用了 ShutdownEndpoint,你可以通过HTTP请求来触发应用程序的关闭。

# 使用curl命令,这会导致应用程序开始关闭过程。
curl -X POST http://localhost:8082/actuator/shutdown

会输出如下信息:

{"message": "Shutting down, bye..."
}

温馨提示:基于安全考虑,由于这个端点会关闭应用程序,所以通常只应该在受保护的环境中使用,例如通过安全框架如Spring Security 限制访问。


自定义方式

您可以通过以下几种方式实现优雅关机时的自定义逻辑:
1、使用 @PreDestroy 注解
在 Spring 管理的 bean 中使用 @PreDestroy 注解,可以在 bean 被销毁之前执行一些清理逻辑。

@Component
public class MyService {@PreDestroypublic void cleanup() {System.out.println("Cleaning up resources...");}
}

2、实现 ApplicationListener 接口
您可以实现 ApplicationListener 接口,以便在应用程序上下文关闭时执行特定操作。

import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;
import org.springframework.stereotype.Component;@Component
public class MyContextClosedListener implements ApplicationListener<ContextClosedEvent> {@Overridepublic void onApplicationEvent(ContextClosedEvent event) {// 执行清理操作System.out.println("Application context is closing...");}
}

3、使用 SpringApplication 的 addListeners 方法
在启动应用程序时,您可以向 SpringApplication 添加自定义监听器,以便在应用程序关闭时执行特定操作。

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextClosedEvent;@SpringBootApplication
public class MyApplication {public static void main(String[] args) {SpringApplication app = new SpringApplication(MyApplication.class);app.addListeners((ApplicationListener<ContextClosedEvent>) event -> {System.out.println("Application is shutting down...");});app.run(args);}
}

4、自定义类继承ShutdownEndpoint,具体方法后续展开。


总结陈词

此篇文章介绍了SpringBoot 项目中如何进行优雅停机的相关知识,仅供学习参考。
💗 后续会逐步分享企业实际开发中的实战经验,有需要交流的可以联系博主。

CSDN_END.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/399850.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深入了解ISO 10012测量管理体系:从认证流程到实施周期

ISO 10012测量管理体系是国际标准化组织&#xff08;ISO&#xff09;推出的一项关键标准&#xff0c;旨在帮助企业确保测量过程的精确性和一致性。这个标准对需要精密测量的行业&#xff0c;如制造业、科学研究等领域尤为重要。了解ISO 10012的认证流程和实施周期&#xff0c;对…

Python数据可视化案例——折线图

目录 json介绍&#xff1a; Pyecharts介绍 安装pyecharts包 构建一个基础的折线图 配置全局配置项 综合案例&#xff1a; 使用工具对数据进行查看 &#xff1a; 数据处理 json介绍&#xff1a; json是一种轻量级的数据交互格式&#xff0c;采用完全独立于编程语言的文…

R的行和列命名和类型的转换

下面内容摘录自&#xff1a; 4章8节&#xff1a;用R做数据重塑&#xff0c;行列命名和数据类型转换-CSDN博客 欢迎订阅我们专栏 一、行和列命名 在数据科学和统计分析中&#xff0c;命名是组织和管理数据的一个重要部分。尤其是在处理复杂的多维数据集时&#xff0c;为行和列命…

HAProxy负载均衡详细解释

目录 1、HAProxy的负载均衡 1.1socat工具的使用 1.1.1对于单进程 1.1.2对于多进程处理方法(对haproxy做热处理) 2、Haproxy的算法 2.1静态算法 <1>static-rr <2>first 2.2动态算法 <1>roundrobin <2>leastconn <3>random 2.3其他算…

OpenGL3.3_C++_Windows(35)

PBR_IBL漫反射 IBL图像的光照(Image based lighting&#xff09;&#xff1a;非直接光源&#xff0c;它是一种更精确的环境光照输入格式&#xff0c;甚至也可以说是一种全局光照的粗略近似。环境光照&#xff1a;获取每个wi光源辐射率&#xff0c;求辐照度&#xff1a;将周围环…

手机IP地址:是根据网络还是设备决定的?

在日益数字化的今天&#xff0c;手机已经成为我们日常生活中不可或缺的一部分。它不仅是我们沟通的桥梁&#xff0c;更是我们获取信息、享受娱乐和完成工作的得力助手。然而&#xff0c;在使用手机上网的过程中&#xff0c;你是否曾经好奇过手机的IP地址是如何被分配的&#xf…

浅谈C语言位段

1、位段的定义 百度百科中是这样解释位段的: 位段&#xff0c;C语言允许在一个结构体中以位为单位来指定其成员所占内存长度&#xff0c;这种以位为单位的成员称为“位段”或称“位域”( bit field) 。利用位段能够用较少的位数存储数据。 以下&#xff0c;我们均在VS2022的…

Llama 3.1中文微调数据集已上线,超大模型一键部署

7 月的 AI 圈真是卷完小模型卷大模型&#xff0c;精彩不停&#xff01;大多数同学都能体验 GPT-4o、Mistral-Nemo 这样的小模型&#xff0c;但 Llama-3.1-405B 和 Mistral-Large-2 这样的超大模型让很多小伙伴犯了难。 别担心&#xff01;hyper.ai 官网在教程板块为大家提供了…

创建第一个Qt项目

创建第一个QT项目 创建工程名称一般不要有特殊符号&#xff0c;不要有中文 项目工程保存路径可修改&#xff0c;路径不要带中文 Base class中的三个选项 QMainWindow:主窗口类&#xff0c;包括菜单栏、工具栏、状态栏。 QWidget:可以创建一个空白的窗口&#xff0c;是所有界…

SQL Server 2022的索引

《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;》图书介绍-CSDN博客 《SQL Server 2022从入门到精通&#xff08;视频教学超值版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) 10.1 索引的含义…

【C++ 面试 - 基础题】每日 3 题(十)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

C# Winform序列化和反序列化

在NET Framework 4.7.2中不能用Newtonsoft.Json进行序列化和反序列化&#xff0c;为解决此问题&#xff0c;采用System.Text.Json进行序列化&#xff0c;注意要添加System.Memory的引用。 1、创建测试类 using System; using System.Collections.Generic; using System.Linq; …

《剑指offer》题目 C++详细题解

JZ15 二进制中1的个数 核心考点&#xff1a;二进制计算 思路一&#xff1a;使用一个循环&#xff0c;因为我们知道整型变量只有32位&#xff0c;所以循环结束的条件就是到32&#xff0c;从最低位开始&#xff0c;逐位检查数字 n 的二进制表示&#xff0c;利用位运算中的与运算…

如何检查端口占用:netstat和lsof指令

在网络故障排查和系统管理中&#xff0c;检查端口占用情况是一项常见且重要的任务。本文将详细介绍如何使用 netstat 和 lsof 这两个强大的工具来检查端口占用和相关服务。 1. 使用 netstat 查看端口占用 netstat (network statistics) 是一个用于显示网络连接、路由表、接口…

前端react集成OIDC

文章目录 OpenID Connect (OIDC)3种 授权模式 【服务端】express 集成OIDC【前端】react 集成OIDCoidc-client-js库 原生集成react-oidc-context 库非组件获取user信息 OAuth 2.0 协议主要用于资源授权。 OpenID Connect (OIDC) https://openid.net/specs/openid-connect-core…

【案例44】Oracle启用“_optimizer_skip_scan_enabled” 参数导致NC系统卡死问题

问题现象 客户反映系统卡顿&#xff0c;很多操作耗时都比较长&#xff0c;通过nmc监控&#xff0c;线程耗时主要集中在数据库上。 问题分析 首先监控数据库服务器资源使用情况&#xff0c;CPU、内存使用正常&#xff0c;没有达到峰值。 监控磁盘IO情况&#xff0c;发现磁盘最…

WPF篇(11)-ToolTip控件(提示工具)+Popup弹出窗口

ToolTip控件 ToolTip控件继承于ContentControl&#xff0c;它不能有逻辑或视觉父级&#xff0c;意思是说它不能以控件的形式实例化&#xff0c;它必须依附于某个控件。因为它的功能被设计成提示信息&#xff0c;当鼠标移动到某个控件上方时&#xff0c;悬停一会儿&#xff0c;…

【C++ 面试 - 基础题】每日 3 题(十一)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/fYaBd &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 C 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏&…

解决浏览器书签同步问题,极空间部署开源免费的跨平台书签同步工具『xBrowserSync』

解决浏览器书签同步问题&#xff0c;极空间部署开源免费的跨平台书签同步工具『xBrowserSync』 哈喽小伙伴们好&#xff0c;我是Stark-C~ 作为一个喜欢折腾的数码党&#xff0c;我平时上网冲浪使用的浏览器绝不会只限于一种&#xff0c;就比如说我在上班的地方只会用到Edge浏…

安科瑞Acrel-2000ES储能能量管理系统在新型电力系统下分布式储能的研究

摘要&#xff1a;传统电力系统的结构和运行模式在以新能源为主体的新型电力系统中发生了巨大的变化&#xff0c;分布式储能作为电力系统中重要的能量调节器&#xff0c;也迎来了新的发展机遇。立足于储能技术发展现状&#xff0c;分析了分布式储能技术特点及在清洁可再生能源方…