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丢失问题以及…...
你知道微信的转账是可以退回的吗
微信作为当今最受欢迎的即时通讯软件之一,其转账功能得到了广泛的应用。在使用微信转账时,我们可能会遇到一些问题,例如误操作、支付失败或者需要退款等等。 首先需要注意的是,微信转账退回的操作只能在“一天内未确认”时进行。如…...
Python开发进阶之路:探索异步编程与高性能应用
在当今快节奏的软件开发环境中,构建高性能、可扩展的应用程序已成为开发者的首要任务。随着互联网应用的普及,用户对响应速度和并发处理能力的要求越来越高。Python,作为一种广泛使用的高级编程语言,凭借其简洁的语法和强大的生态…...
用100道题拿下你的算法面试(链表篇-7):复制带随机指针的链表
一、面试问题 给定一个链表的头节点,链表中每个节点都包含两个指针:一个指向下一个节点的 next 指针,以及一个指向链表中任意节点的 random 指针。请复制该链表,并返回新链表的头节点。 二、【朴素解法】使用哈希表 —— 时间复杂…...
Nature论文检索正在失效,Perplexity底层检索逻辑重构预警(仅限科研骨干内部流通的3条技术简报)
更多请点击: https://intelliparadigm.com 第一章:Nature论文检索正在失效,Perplexity底层检索逻辑重构预警(仅限科研骨干内部流通的3条技术简报) 检索信号衰减的实证观测 近期对Nature、Science主站及PubMed Centra…...
5月12日直播 | CANN Bench:为昇腾算子评测立起一把统一的尺子
CANN Bench:为昇腾算子评测立起一把统一的尺子 当 Coding Agent 一次写出几十个算子已成为常态,"什么算优质算子"变成了一个单一维度无法评估准确的问题:能不能过编译只是入场券,精度是否经得起验证、换个 shape 换个 d…...
数字永生:将意识上传云端的技术与伦理极限
——一个软件测试从业者的技术解构与风险分析各位同行,当你看到“数字永生”这四个字时,脑海里浮现的是什么?是马斯克口中2045年即将实现的意识上传,还是《黑镜》里那些被困在虚拟牢笼中的数字灵魂?作为一个每天与需求…...
taotoken模型广场功能体验与主流模型选型建议
🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 taotoken模型广场功能体验与主流模型选型建议 1. 平台入口与模型广场概览 登录Taotoken控制台后,最直观的功能入口之一…...
抖音下载器终极指南:3分钟实现无水印批量下载的高效解决方案
抖音下载器终极指南:3分钟实现无水印批量下载的高效解决方案 【免费下载链接】douyin-downloader A practical Douyin downloader for both single-item and profile batch downloads, with progress display, retries, SQLite deduplication, and browser fallback…...
从一次内部渗透测试说起:我是如何利用SSRF漏洞,通过Gopher协议拿下Redis的
渗透测试实战:SSRF漏洞到Redis未授权访问的完整攻击链剖析 在一次常规的企业内部渗透测试中,我发现了一个看似普通的SSRF漏洞,却意外打开了通往内网核心系统的大门。这个故事不是教科书式的漏洞复现,而是一个真实攻击者视角下的完…...
边缘AI与TinyML在医疗影像筛查中的实战:从模型轻量化到临床部署
1. 项目概述:当AI成为医生的“仿生眼”在医疗诊断领域,尤其是癌症早期筛查中,人类医生的经验与肉眼观察长期是金标准。然而,这个标准背后隐藏着巨大的不确定性:研究显示,即便是标准的放射影像学检查&#x…...
2026年项目管理工具测评:10款主流软件对比与企业选型建议
本文测评 ONES、Tower、Jira、Asana、monday、ClickUp、Notion、Trello、Microsoft Project、Smartsheet 十款项目管理工具,帮助选型人员从组织规模、项目复杂度、协作方式与治理需求出发,判断哪类项目管理工具更适合自身团队。一、10款项目管理工具速览…...
