在生产环境中遇到一些奇葩的问题,一部署服务,就有一些异常的数据,经过分析是部署shell中直接用kill -9进行关闭服务,一些请求还在处理中就被kill了,导致数据存脏数据。开始提出了一些方案,比如后台增加开始部署按钮,点击后,关键的请求(如交易)被拒绝,没有完成的请求继续,等待一段时间后部署。后来看到一篇文章中提到了如何优雅关闭服务器,便详细研究研究,总结了一下优雅关闭服务器大概包括一下几种:
1、设置拦截器,需要部署时点击后台按钮激活拦截关键的请求。过一段时间再部署。缺点是部署麻烦,需要人工去点击。这也是解决问题的初始想法,后来放弃了。

2、通过actuator/shutdown,该功能是集成spring-actuator的功能,操作步骤是:
a、引入
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
b、在配置文件中添加
management.endpoint.shutdown.enabled=true management.endpoints.web.exposure.include=shutdown
c、关闭发送请求:http://localhost/actuator/shutdown
测试过程:先求/leader**,请求在处理中,然后发送http://localhost/actuator/shutdown请求,接着请求/leader**。第一次的/leader**有返回,第二次则显示Could not get any response。
actuator源码:

@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();}//和3中的原理一样this.context.close();}
}

3、自己实现关闭请求接口,通过ConfigurableApplicationContext 的close方法。

 @GetMapping("/shutdown")@ApiOperation(value = "关机")public void shutDown() {ConfigurableApplicationContext ctx = (ConfigurableApplicationContext) context;log.info("关机");ctx.close();}

测试:先求/leader**,请求在处理中,然后发送/shutdown请求,接着请求/leader**。
第一次的/leader**有返回,第二次则显示Could not get any response。

@GetMapping("/leader**")@ApiOperation(value = "***排行榜")public Result getLeaderBoard(PageVo pageVo,LeaderBoardTypeEnum leaderBoardTypeEnum) throws InterruptedException {ThreadLocalUtil.setCacheValue(pageVo);log.info("+++++++++++++++++++++++++++++++++++++++++++准备睡觉");Thread.sleep(20 * 1000L);log.info("--------------------------------------------睡醒了");log.info(leaderBoardTypeEnum.getValue());LeaderBoardService bean = (LeaderBoardService) context.getBean(leaderBoardTypeEnum.className());return bean.handle();}

测试结果如下:


4、在最新的 spring boot 2.3 版本,内置此功能,不需要再自行扩展容器线程池来处理,
目前 spring boot 嵌入式支持的 web 服务器(Jetty、Reactor Netty、Tomcat 和 Undertow)以及反应式和基于 Servlet 的 web 应用程序都支持优雅停机功能。我们来看下如何使用:
当使用server.shutdown=graceful启用时,在 web 容器关闭时,web 服务器将不再接收新请求,并将等待活动请求完成的缓冲期。

然后在shell部署脚本中停止服务用kill -2。这种方法在服务中尝试了一下,没有成功,在努力中。。。

springboot中如何graceful关闭服务器相关推荐

  1. Linux中把文件夹打成war包,SpringBoot中maven项目打成war包部署在liunx服务器上的方法...

    说明:Spring Boot由于内嵌了如Tomcat,Jetty和Undertow这样的容器,也就是说可以直接跑起来,用不着再像Spring项目还需要外置的Tomcat等容器来进行部署工作了,通过启动 ...

  2. Linux中的Java项目服务器无故关闭

    部署在Linux中的项目,最近一直无故关闭.找了很多都找不到原因.最近发现一个现象终于让我知道是什么原因导致我的开发服务器无故关闭了. 起因 部署在linux中的java开发服务器最近一直无故关闭.且 ...

  3. WebSocket的故事(六)—— Springboot中,实现更灵活的WebSocket

    概述 WebSocket的故事系列计划分五大篇六章,旨在由浅入深的介绍WebSocket以及在Springboot中如何快速构建和使用WebSocket提供的能力.本系列计划包含如下几篇文章: 第一篇 ...

  4. netty的使用场景,线程模型以及如何在springboot中使用netty?

    文章目录 1. 为什么使用netty? 2. netty的线程模型 3. 在springboot中使用netty 4. netty的核心API解释 5. netty中的ByteBuf 1. 为什么使用 ...

  5. SpringBoot中AOP实现落地——Filter(过滤器)、Intercepter(拦截器)、Aspect(Spring AOP)

    文章目录 一.一切要从Servlet说起 1.1什么是Servlet 1.2为什么需要Servlet 1.3Servlet如何响应用户请求 1.4Servlet与Tomcat处理请求的流程 1.5Se ...

  6. Springboot中使用websocket发送信息给指定用户和群发

    websocket是一种长连接协议,相较于传统的http短连接,websocket不仅可以由客户端向服务器发送消息,可以主动向客户端发起信息,经常用于及时聊天,游戏和服务器向客户端推送信息. 主要优点 ...

  7. Redis中的连接池以及在Springboot中的使用

    1.为什么要使用连接池以及常用客户端的区别     众所周知,Redis是单线程的,那为什么还要使用连接池?首先Redis也是一种基于内存数据库,有着很高的性能,但是我们的系统使用Redis服务时需要 ...

  8. 数据源(DataSource)是什么以及SpringBoot中数据源配置

    数据源 数据源,简单理解为数据源头,提供了应用程序所需要数据的位置.数据源保证了应用程序与目标数据之间交互的规范和协议,它可以是数据库,文件系统等等.其中数据源定义了位置信息,用户验证信息和交互时所需 ...

  9. SpringBoot中文件下载、拦截器、war包部署、jar包部署

    3. SpringBoot中文件下载 将可以被下载资源放在磁盘的 D:\springbootcodes\springboot_day6\download 路径 这里我们使用jsp开发 引入依赖使tom ...

  10. 在SpringBoot中整合使用Netty框架

    Netty是一个非常优秀的Socket框架.如果需要在SpringBoot开发的app中,提供Socket服务,那么Netty是不错的选择. Netty与SpringBoot的整合,我想无非就是要整合 ...

最新文章

  1. Python学习笔记17:标准库之数学相关(math包,random包)
  2. 由浅到深了解JavaScript类
  3. Android细节问题总结(二)
  4. 20175322 周弋鸿 2018-2019-2 《Java程序设计》第八周学习总结
  5. (转)两大量化交易巨头“抱团取暖”:Virtu14亿美元收购骑士资本
  6. 传智燕青学成在线项目视频分享
  7. ad中电容用什么封装_【AD封装】贴片插件晶振(带3D)
  8. 松下FP系列PLC以太网通讯
  9. 今日BIM—中交一公院发布道路专用BIM设计软件
  10. 页面自动获取导入excel内容
  11. java帮助文档mye_【SpringMVC】使用Myeclipse创建SpringMVC项目【超详细教程】
  12. 机器学习——支持向量机(SVM)之超平面、间隔与支持向量
  13. TCP/IP之大明王朝邮差
  14. 全球14个典型区域的total runof 泰勒图比较
  15. 如何面对不及预期目标的成绩(结果)?
  16. 制作一个网站前你应该了解哪些东西?怎么搭建网站?
  17. Java学习之性能优化常用方法分享
  18. 鸿蒙开发工具DevEco Studio安装指导
  19. 3分钟了解 vue props type类型
  20. 大学计算机重修有什么影响,大学重修会有什么影响

热门文章

  1. 第七十六篇 MIPI简单说明
  2. opencv-python实际演练(二)军棋自动裁判(5)棋子文字的自动识别
  3. 概率论与数理统计前两章总结
  4. 智能网联车载终端渗透率提升之道
  5. linux编译trinitycore,[MAC] 编译安装和测试《魔兽世界》模拟服务端 TrinityCore
  6. 百度地图如何拾取经纬度
  7. 【转】O'Reilly Java系列书籍建议阅读顺序(转自蔡学庸)
  8. BUUCTF:小易的U盘
  9. 一元二次方程的解的程序
  10. Mac上有哪些软件可以代替Office或Word的软件?