点击上方“方志朋”,选择“设为星标”

回复”666“获取新整理的面试文章

什么是优雅停机

先来一段简单的代码,如下:

@RestController
public class DemoController {@GetMapping("/demo")public String demo() throws InterruptedException {// 模拟业务耗时处理流程Thread.sleep(20 * 1000L);return "hello";}
}

当我们流量请求到此接口执行业务逻辑的时候,若服务端此时执行关机 (kill),spring boot 默认情况会直接关闭容器(tomcat 等),导致此业务逻辑执行失败。在一些业务场景下:会出现数据不一致的情况,事务逻辑不会回滚。

graceful shutdown

在最新的 spring boot 2.3 版本,内置此功能,不需要再自行扩展容器线程池来处理,
目前 spring boot 嵌入式支持的 web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。我们来看下如何使用:

当使用server.shutdown=graceful启用时,在 web 容器关闭时,web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。

配置体验

此处支持的 shutdown 行为,我们看下 源码枚举如下:

/*** Configuration for shutting down a {@link WebServer}.** @author Andy Wilkinson* @since 2.3.0*/
public enum Shutdown {/*** 优雅停机 (限期停机)**/GRACEFUL,/*** 立即停机*/IMMEDIATE;}

缓冲期 timeout-per-shutdown-phase 配置

默认时间为 30S, 意味着最大等待 30S,超时候无论线程任务是否执行完毕都会停机处理,一定要合理合理设置。()

效果体验

请求服务端接口

执行关闭应用

服务端接到关闭指令

2020-05-17 18:28:28.940  INFO 60341 --- [extShutdownHook] o.s.b.w.e.tomcat.GracefulShutdown        : Commencing graceful shutdown. Waiting for active requests to complete
2020-05-17 18:28:45.923  INFO 60341 --- [tomcat-shutdown] o.s.b.w.e.tomcat.GracefulShutdown        : Graceful shutdown complete

接口请求执行完成

相关知识

1.关于此处执行kill -2 而不是 kill -9

kill -2 相当于快捷键 Ctrl + C 会触发 Java 的 ShutdownHook 事件处理(优雅停机或者一些后置处理可参考以下源码)

//ApplicationContext@Overridepublic void registerShutdownHook() {if (this.shutdownHook == null) {// No shutdown hook registered yet.this.shutdownHook = new Thread(SHUTDOWN_HOOK_THREAD_NAME) {@Overridepublic void run() {synchronized (startupShutdownMonitor) {doClose();}}};Runtime.getRuntime().addShutdownHook(this.shutdownHook);}}

kill -9,暴力美学强制杀死进程,不会执行 ShutdownHook

2.通过 actuate 端点实现优雅停机

POST 请求 /actuator/shutdown 即可执行优雅关机。后端技术精选公众号内回复“后端面试”,送你一份各大公司整理的Java面试题!

源码解析

@Endpoint(id = "shutdown", enableByDefault = false)
public class ShutdownEndpoint implements ApplicationContextAware {@WriteOperationpublic Map<String, String> shutdown() {Thread thread = new Thread(this::performShutdown);thread.setContextClassLoader(getClass().getClassLoader());thread.start();}private void performShutdown() {try {Thread.sleep(500L);}catch (InterruptedException ex) {Thread.currentThread().interrupt();}// 此处close 逻辑和上边 shutdownhook 的处理一样this.context.close();}
}

3.不同 web 容器优雅停机行为区别

容器停机行为取决于具体的 web 容器行为

热门内容:Elasticsearch 在各大互联网公司大量真实的应用案例!JAVA 线上故障排查完整套路!牛掰!
干掉 "ZooKeeper",阿里为什么不用 ZK 做服务发现?一个牛逼的微服务!最近面试BAT,整理一份面试资料《Java面试BAT通关手册》,覆盖了Java核心技术、JVM、Java并发、SSM、微服务、数据库、数据结构等等。
获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

明天见(。・ω・。)ノ♡

SpringBoot 2.3 新特性之优雅停机,这波操作太秀了!相关推荐

  1. SpringBoot 2.3 新特性之优雅停机

    1 SpringBoot 2.3 新特性之优雅停机 什么是优雅停机 先来一段简单的代码,如下: @RestController public class DemoController {@GetMap ...

  2. Spring Boot 2.3.0 新特性:优雅停机!

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 前言:关于Spring Boot.Spring Cloud应用的优 ...

  3. Spring Boot 2.3.0 新特性:优雅停机

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 前言:关于Spring Boot.Spring Clou ...

  4. jdk1.8新特性的应用-Stream 的终止操作

    jdk1.8新特性的应用-Stream 的终止操作 public class TestStreamApi4 {List<Employee> emps = Arrays.asList(new ...

  5. Java8新特性总结 -5.Stream API函数式操作流元素集合

    所有示例代码打包下载 : 点击打开链接 Java8新特性 : 接口新增默认方法和静态方法 Optional类 Lambda表达式 方法引用 Stream API - 函数式操作流元素集合 Date/T ...

  6. jdk1.8新特性 Lambda表达式和Stream集合操作(详细)

    Lambda表达式 ① 语法 lambda表达式 ,是JDK1.8新增的特性 使用新的运算符 -> (转到.称为) lambda表达式的组成 第1部分: (参数) 第2部分: -> 第3部 ...

  7. 使用JavaScript ES6的新特性计算Fibonacci(非波拉契数列)

    面试题:用JavaScript开发一个函数,打印非波拉契数列. 我们只要记住非波拉契数列的计算公式,就不难写出来了: F(0)=1,F(1)=1, F(n)=F(n-1)+F(n-2) 我写的Java ...

  8. java8 新特性之流式数据处理_Java8新特性 - 集合流式编程 - 最终操作

    2.数据源的获取 2.1.数据源的简介 数据源,顾名思义,既是流中的数据的来源.是集合的流式编程的第一步,将数据源中的数据读取到流中,进行处理.注意:将数据读取到流中进行处理的时候,与数据源中的数据没 ...

  9. 体验AI拜年新姿势,爱奇艺技术团队这波操作真秀!

    春节是中国人最看重,也是最具仪式感的节日,回首往年春节假期,无外乎三个关键词:拜年.消费.聚会.而2021年春节和以往不同,为响应国家号召,不少人选择就地过年,与之相伴而生的还有"云拜年&q ...

最新文章

  1. 干货 | 大数据人工智能领域从菜鸟到高手晋级指南
  2. Oracle学习笔记:blank_trimming的含义
  3. js中 json详解
  4. 大学计算机基础总结,大学计算机基础第二章总结
  5. bootstrap-导航菜单
  6. PNG无损压缩工具Optipng【备忘】
  7. Python基础课程笔记·嵩天
  8. 科研绘图软件GraphPad Prism教程(三)
  9. 小米论坛php,黑橙新版小米社区discuz模板
  10. 传奇服务器攻城文件,单机架设传奇服务器第33课:攻城奖励自动发放
  11. PCI Expansion ROMs
  12. ThinkPad T420 clover引导安装黑苹果(x220和T520也适用)
  13. 有一张厚度为0.1mm的纸,假设它足够大,重复将其对折,问对折多少次之后,其厚度可达(再对折一次就超过)珠穆朗玛峰的高度?(C语言)
  14. 2021年,小灰都读了哪些书?
  15. connect holder is null问题记录
  16. html5经纬度定位 源码_利用HTML5定位功能获取经纬度,在根据经纬度利用百度地图获取位置信息...
  17. python+tensorflow CNN卷积神经网络手写字体识别
  18. 【2019春招准备:A1】
  19. 《老路用得上的商学课》21-30学习笔记
  20. 树莓派制作无线路由器

热门文章

  1. 微信小程序实例源码大全demo下载
  2. 使用Python命令创建jenkins的job
  3. hive中array嵌套map以及行转列的使用
  4. SQLserver 常用函数适用方法(转载)
  5. Linux最大打开文件描述符数
  6. 分布式技术一周技术动态 2016-11-27
  7. 设计模式之笔记--装饰模式(Decorator)
  8. c中结构体的4种定义
  9. java学习之匿名内部类与包装类
  10. 【随记】动态调用web服务