springboot项目如何优雅停机
文章目录
- 前言
- kill -9 pid的危害
- 如何优雅的停机
- 理论步骤
- 优雅方式
- 1、kill -15 pid 命令停机
- 2、ApplicationContext close停机
- 3、actuator shutdown 停机
- 4、ApplicationListener 监听延时停机
前言
相信很多同学都会用Kill -9 PID来杀死进程,如果用在我们微服务项目里面,突然杀死进程会有什么后果?有没有其他的方式优雅的停机呢?今天,我们就来讨论下kill -9 pid 这个命令对微服务项目的影响,以及如何优雅的停机的问题。
kill -9 pid的危害
kill -9 属于暴利删除,直接杀死进程。对于微服务系统而言,直接判了死刑,直接从系统层面对进程进行了结束。微服务中的线程,根本没有反应的机会直接香消玉损。
比如前端发起的订单请求,后端springboot项目中的线程正在处理订单数据的保存。此时如果kill -9 pid 将微服务进程杀死,后端将不会有任何响应请求的机会,页面请求会立即中断出现异常情况。虽然一般对于后端事务数据库都会回滚,但是,页面出现异常毕竟会让用户体验度下降。
如何优雅的停机
理论步骤
1、停止接收请求和内部线程
2、判断是否有线程正在执行
3、等待正在执行的线程执行完毕
4、停止tomcat容器
优雅方式
1、kill -15 pid 命令停机
项目增加测试入口:
/*** 停机 测试* kill -15* kill -9* @return a* @author senfel* @date 2023/5/13 17:37*/
@GetMapping("test")
public void test(){log.error("测试方法进入开始===========");try {Thread.sleep(100000);} catch (InterruptedException e) {e.printStackTrace();}log.error("测试方法执行结束===========");
}
服务启动项目
[root@devops-01 tmp]# nohup java -jar demo.jar &
[11] 43451
[root@devops-01 tmp]# nohup: ignoring input and appending output to ‘nohup.out’
页面访问地址后服务器用kill -15 PID结束进程
[root@devops-01 tmp]# kill -15 43451
查看日志:
居然报错了,但是测试日志都打印出来了。为什么会报错呢?这就和sleep这个方法有关了,在线程休眠期间,当调用线程的interrupt方法的时候会导致sleep抛出异常,这里很明显就是kill -15 这个命令会让程序马上调用线程的interrupt方法,目的是为了让线程停止,虽然让线程停止,但线程什么时候停止还是线程自己决定。
kill -15 pid 会等待线程执行完并拒绝新的请求,如果有线程睡眠会抛出java.lang.InterruptedException异常。
2、ApplicationContext close停机
项目增加测试代码:
/*** shutdown* @author senfel* @version 1.0* @date 2023/5/13 18:04*/
@RestController
@Slf4j
public class ShutDownController implements ApplicationContextAware {private ApplicationContext context;@Overridepublic void setApplicationContext(ApplicationContext applicationContext) throws BeansException {this.context = applicationContext;}/*** 停机 ConfigurableApplicationContext方式* @return a* @author senfel* @date 2023/5/13 17:36*/@PostMapping(value = "shutdown")public void shutdown(){ConfigurableApplicationContext cyx = (ConfigurableApplicationContext) context;cyx.close();}
}
启动项目
[root@devops-01 tmp]# nohup java -jar demo.jar &
[15] 44001
[root@devops-01 tmp]# nohup: ignoring input and appending output to ‘nohup.out’
调用测试方法后,调用上下文主动停机接口/shutdown
查看服务日志:
同样的日志信息,表示调用上下文停机后会等待线程执行完并拒绝新的请求,如果有线程睡眠会抛出java.lang.InterruptedException异常。
3、actuator shutdown 停机
引入依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
配置yml
management:endpoints:web:exposure:include: health,shutdownendpoint:shutdown:enabled: true
这种方式是通过引入依赖的方式停止服务,actuator提供了很多接口,比如健康检查,基本信息等等,
我们也可以使用他来优雅的停机。
调用接口测试//actuator/shutdown
查看日志:
查看日志同样是停机后会等待线程执行完并拒绝新的请求,如果有线程睡眠会抛出java.lang.InterruptedException异常。只不过页面会有提示,更加的友好。
4、ApplicationListener 监听延时停机
以上三种都是直接打断睡眠线程,那么有没有一种方式在阻断新请求的同时,让睡眠线程睡眠完成优雅停机呢?
有点,我们的ApplicationListener 可以监听到服务关闭事件,覆写事件并延时即可。
增加监听代码:
/*** GracefulShutdown* @author senfel* @version 1.0* @date 2023/5/13 19:40*/
@Slf4j
@Component
public class GracefulShutdown implements TomcatConnectorCustomizer, ApplicationListener<ContextClosedEvent> {private volatile Connector connector;@Overridepublic void customize(Connector connector) {this.connector = connector;}@Overridepublic void onApplicationEvent(ContextClosedEvent event) {this.connector.pause();Executor executor = this.connector.getProtocolHandler().getExecutor();if (executor instanceof ThreadPoolExecutor) {try {ThreadPoolExecutor threadPoolExecutor = (ThreadPoolExecutor) executor;threadPoolExecutor.shutdown();if (!threadPoolExecutor.awaitTermination(30, TimeUnit.SECONDS)) {log.error("Tomcat thread pool did not shut down gracefully within 30 seconds. Proceeding with forceful shutdown");}} catch (InterruptedException ex) {Thread.currentThread().interrupt();}}}
}
先请求带有睡眠代码的接口,然后停机,查看日志:
相关文章:

springboot项目如何优雅停机
文章目录 前言kill -9 pid的危害如何优雅的停机理论步骤优雅方式1、kill -15 pid 命令停机2、ApplicationContext close停机3、actuator shutdown 停机4、ApplicationListener 监听延时停机 前言 相信很多同学都会用Kill -9 PID来杀死进程,如果用在我们微服务项目里…...

springboot mybatis-plus 代码生成工具
介绍 基于mybatis-plus代码生成工具 后续会不断完善 规划 后续会基于此功能搞低代码平台,会有前端VUE mybatis-plus介绍&特性 • 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 • 损耗小࿱…...

超全、超详细的Redis学习笔记总结
❤ 作者主页:欢迎来到我的技术博客😎 ❀ 个人介绍:大家好,本人热衷于Java后端开发,欢迎来交流学习哦!( ̄▽ ̄)~* 🍊 如果文章对您有帮助,记得关注、点赞、收藏、…...

Day05 04-MySQL分库分表介绍
文章目录 第十七章 MySQL分库分表17.1 什么是分库分表17.2 为什么要分库分表17.3 垂直切分17.3.1 垂直分库17.3.2 垂直分表 17.4 水平切分17.4.1 水平分库17.4.2 水平分表17.4.3 常见的水平切分规则 第十七章 MySQL分库分表 17.1 什么是分库分表 MySQL数据库常见的优化方案中…...

基于SpringBoot+vue的毕业生信息招聘平台设计和实现
博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…...

git一定要学会,加油
gitgit文档http://file:///F:/%E8%B5%84%E6%96%99%E5%A4%8D%E4%B9%A0/Git%E4%BC%98%E7%A7%80%E5%BC%80%E6%BA%90%E4%B9%A6%E7%B1%8D/Git%E5%BC%80%E6%BA%90%E4%B9%A6%E7%B1%8D/Pro%20Git%E4%B8%AD%E6%96%87PDF%E7%89%88.pdf init 初始化仓库 这个命令在当前目录下初始化一个 G…...
TVM面试题
1、TVM中的调度器(Scheduler)是什么?请简要解释TVM调度器的作用和工作原理。 TVM中的调度器(Scheduler)是负责将计算图映射到特定硬件目标上的组件。调度器在TVM中起着关键的作用,它决定了计算图的执行方式、并行化策略以及内存布局等,以优化…...
CSS相关面试题
1、标准盒子模型和IE怪异盒子模型? 标准盒子模型就是指的元素的宽度和高度仅包括的内容区域,不包括边框和内边距,也就是说,元素的实际宽度和高度等于内容区域的宽度和高度IE怪异盒子是指元素的高度和宽度,包括内容区域…...
6.11总结
这周准备了蓝桥杯,主要看了一些以前学过的东西,看了二分,树状数组,树状数组二分,复习了利用倍增相关的算法。 周六去打的蓝桥杯,总体来说也就一般吧,出了考场突然想起来我b题中间的称号写成了加…...

Hazel游戏引擎(008-009)事件系统
文中若有代码、术语等错误,欢迎指正 文章目录 008、事件系统-设计009、事件系统-自定义事件前言自定义事件类与使用声明与定义类代码包含头文件使用事件 事件调度器代码 C知识:FunctionBind用法function基本使用 012、事件系统-DemoLayer用EventDispache…...

【C++】 STL(上)STL简述、STL容器
文章目录 简述STL容器list链表vector向量deque双端队列map映射表set集合hash_map哈希表 简述 STL是“Standard Template Library”的缩写,中文译为“标准模板库”。STL是C标准库的一部分,位与各个C的头文件中,即他并非以二进制代码的形式提供…...
【002 基础知识】什么是原子操作?
一、原子操作 原子操作就是指不能再进一步分割的操作。 二、为了实现一个互斥,自己定义一个变量作为标记来作为一个资源只有一个使用者行不行? 不行。如果在一个线程正持有锁时(2处),线程上下文发生切换,…...

English Learning - L3 作业打卡 Lesson5 Day32 2023.6.5 周一
English Learning - L3 作业打卡 Lesson5 Day32 2023.6.5 周一 引言🍉句1: What do you read when you are travelling by train or bus?成分划分弱读爆破语调 🍉句2: What are other passengers reading?成分划分弱读连读语调 🍉句3: Perh…...

深度学习应用篇-自然语言处理-命名实体识别[9]:BiLSTM+CRF实现命名实体识别、实体、关系、属性抽取实战项目合集(含智能标注)【上篇】
【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化算法、卷积模型、序列模型、预训练模型、对抗神经网络等 专栏详细介绍:【深度学习入门到进阶】必看系列,含激活函数、优化策略、损失函数、模型调优、归一化…...

腾讯安全SOC+荣获“鑫智奖”,助力金融业数智化转型
近日,由金科创新社主办,全球金融专业人士协会支持的“2023鑫智奖第五届金融数据智能优秀解决方案评选”榜单正式发布。腾讯安全申报的“SOC基于新一代安全日志大数据平台架构的高级威胁安全治理解决方案”获评“鑫智奖网络信息安全创新优秀解决方案”。 …...
Python绘制气泡图示例
部分数据来源:ChatGPT 引言 在数据可视化领域中,气泡图是一种能够同时展示三维信息的图表类型,常用于表示数据集中的两个变量之间的关系。Python中提供了许多用于绘制气泡图的可视化库,比如pyecharts。在本篇文章中,我们将介绍如何使用pyecharts库绘制一个简单的气泡图,…...

数学建模经历-程序人生
引言 即将大四毕业(现在大三末),闲来无事(为了冲粽子)就写一篇记录数学建模经历的博客吧。其实经常看到一些大佬的博客里会有什么"程序人生"、"人生感想"之类的专栏,但是由于我只是一个小趴菜没什么阅历因此也就没有写过类似的博客…...

数字电子电路绪论
博主介绍:一个爱打游戏的计算机专业学生 博主主页:夏驰和徐策 所属专栏:程序猿之数字电路 1.科技革命促生互联网时代 科技革命对互联网时代的兴起产生了巨大的推动作用。以下是一些科技革命对互联网时代的促进因素: 1. 计算机技…...

电脑丢失dll文件一键修复需要什么软件?快速修复dll文件的方法
在使用电脑的过程中,我们经常会遇到程序无法正常运行的情况,提示“XXX.dll文件丢失”的错误。这时候,很多人会感到困惑,不知道该如何解决。本文将详细介绍dll文件丢失的各种原因、如何使用dll修复工具进行一键修复dll丢失问题以及…...

你知道微信的转账是可以退回的吗
微信作为当今最受欢迎的即时通讯软件之一,其转账功能得到了广泛的应用。在使用微信转账时,我们可能会遇到一些问题,例如误操作、支付失败或者需要退款等等。 首先需要注意的是,微信转账退回的操作只能在“一天内未确认”时进行。如…...

C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...

【kafka】Golang实现分布式Masscan任务调度系统
要求: 输出两个程序,一个命令行程序(命令行参数用flag)和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽,然后将消息推送到kafka里面。 服务端程序: 从kafka消费者接收…...
ES6从入门到精通:前言
ES6简介 ES6(ECMAScript 2015)是JavaScript语言的重大更新,引入了许多新特性,包括语法糖、新数据类型、模块化支持等,显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var…...

Prompt Tuning、P-Tuning、Prefix Tuning的区别
一、Prompt Tuning、P-Tuning、Prefix Tuning的区别 1. Prompt Tuning(提示调优) 核心思想:固定预训练模型参数,仅学习额外的连续提示向量(通常是嵌入层的一部分)。实现方式:在输入文本前添加可训练的连续向量(软提示),模型只更新这些提示参数。优势:参数量少(仅提…...

MongoDB学习和应用(高效的非关系型数据库)
一丶 MongoDB简介 对于社交类软件的功能,我们需要对它的功能特点进行分析: 数据量会随着用户数增大而增大读多写少价值较低非好友看不到其动态信息地理位置的查询… 针对以上特点进行分析各大存储工具: mysql:关系型数据库&am…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
Linux离线(zip方式)安装docker
目录 基础信息操作系统信息docker信息 安装实例安装步骤示例 遇到的问题问题1:修改默认工作路径启动失败问题2 找不到对应组 基础信息 操作系统信息 OS版本:CentOS 7 64位 内核版本:3.10.0 相关命令: uname -rcat /etc/os-rele…...
QT3D学习笔记——圆台、圆锥
类名作用Qt3DWindow3D渲染窗口容器QEntity场景中的实体(对象或容器)QCamera控制观察视角QPointLight点光源QConeMesh圆锥几何网格QTransform控制实体的位置/旋转/缩放QPhongMaterialPhong光照材质(定义颜色、反光等)QFirstPersonC…...
华为OD最新机试真题-数组组成的最小数字-OD统一考试(B卷)
题目描述 给定一个整型数组,请从该数组中选择3个元素 组成最小数字并输出 (如果数组长度小于3,则选择数组中所有元素来组成最小数字)。 输入描述 行用半角逗号分割的字符串记录的整型数组,0<数组长度<= 100,0<整数的取值范围<= 10000。 输出描述 由3个元素组成…...

2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...