前期踩的坑 (spring boot 1.x)

1. 添加mavne依赖

org.springframework.boot

spring-boot-starter-actuator

2. 启用shutdown

在配置文件里添加下面的配置

#启用shutdown endpoint的http访问

endpoints.shutdown.enabled=true

#不需要验证

endpoints.shutdown.sensitive=false

启动的时候可以看到下面的日志,就说明成功了

3. 优雅停机

发送post请求 http://localhost:8080/shutdown

如果响应码是404 可以尝试post http://localhost:8080/actuator/shutdown

spring boot 2.0

如果你使用的spring boot版本是2.x的就会发现,这些post请求都会出现404的结果。

下面是spring boot 2.0 优雅停机的实现方式。

1.修改application启动类

tomcat容器

@springbootapplication

public class shutdownapplication {

public static void main(string[] args) {

springapplication.run(shutdownapplication.class, args);

}

/**

* 用于接受 shutdown 事件

*/

@bean

public gracefulshutdown gracefulshutdown() {

return new gracefulshutdown();

}

/**

* 配置tomcat

*

* @return

*/

@bean

public servletwebserverfactory servletcontainer() {

tomcatservletwebserverfactory tomcat = new tomcatservletwebserverfactory();

tomcat.addconnectorcustomizers(gracefulshutdown());

return tomcat;

}

/**

* 优雅关闭 spring boot。容器必须是 tomcat

*/

private class gracefulshutdown implements tomcatconnectorcustomizer, applicationlistener {

private final logger log = loggerfactory.getlogger(gracefulshutdown.class);

private volatile connector connector;

private final int waittime = 10;

@override

public void customize(connector connector) {

this.connector = connector;

}

@override

public void onapplicationevent(contextclosedevent contextclosedevent) {

this.connector.pause();

executor executor = this.connector.getprotocolhandler().getexecutor();

if (executor instanceof threadpoolexecutor) {

try {

threadpoolexecutor threadpoolexecutor = (threadpoolexecutor) executor;

threadpoolexecutor.shutdown();

if (!threadpoolexecutor.awaittermination(waittime, timeunit.seconds)) {

log.warn("tomcat 进程在" + waittime + " 秒内无法结束,尝试强制结束");

}

} catch (interruptedexception ex) {

thread.currentthread().interrupt();

}

}

}

}

}

undertow容器 (没有使用过,不保证可用)

@springbootapplication

public class application {

public static void main(string[] args) {

springapplication.run(application.class, args);

}

/**

* 优雅关闭 spring boot

*/

@component

public class gracefulshutdown implements applicationlistener {

@autowired

private gracefulshutdownwrapper gracefulshutdownwrapper;

@autowired

private servletwebserverapplicationcontext context;

@override

public void onapplicationevent(contextclosedevent contextclosedevent){ gracefulshutdownwrapper.getgracefulshutdownhandler().shutdown();

try {

undertowservletwebserver webserver = (undertowservletwebserver)context.getwebserver();

field field = webserver.getclass().getdeclaredfield("undertow");

field.setaccessible(true);

undertow undertow = (undertow) field.get(webserver);

list listenerinfo = undertow.getlistenerinfo();

undertow.listenerinfo listener = listenerinfo.get(0);

connectorstatistics connectorstatistics = listener.getconnectorstatistics();

while (connectorstatistics.getactiveconnections() > 0){}

}catch (exception e){

// application shutdown

}

}

}

@component

public class gracefulshutdownwrapper implements handlerwrapper{

private gracefulshutdownhandler gracefulshutdownhandler;

@override

public httphandler wrap(httphandler handler) {

if(gracefulshutdownhandler == null) {

this.gracefulshutdownhandler = new gracefulshutdownhandler(handler);

}

return gracefulshutdownhandler;

}

public gracefulshutdownhandler getgracefulshutdownhandler() {

return gracefulshutdownhandler;

}

}

@component

@allargsconstructor

public class undertowextraconfiguration {

private final gracefulshutdownwrapper gracefulshutdownwrapper;

@bean

public undertowservletwebserverfactory servletwebserverfactory() {

undertowservletwebserverfactory factory = new undertowservletwebserverfactory();

factory.adddeploymentinfocustomizers(deploymentinfo -> deploymentinfo.addouterhandlerchainwrapper(gracefulshutdownwrapper));

factory.addbuildercustomizers(builder -> builder.setserveroption(undertowoptions.enable_statistics, true));

return factory;

}

}

}

2. 使用 kill命令杀死进程

使用下面的命令杀死进程。该命令是向 某个进程发送终止信号。

kill -15 [pid]

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

如您对本文有疑问或者有任何想说的,请点击进行留言回复,万千网友为您解惑!

java 优雅停机_spring boot2.0实现优雅停机的方法相关推荐

  1. springboot 优雅停机_Spring boot 2.3优雅下线,距离生产还有多远?

    简介:对于任何一个线上应用,如何在服务更新部署过程中保证业务无感知是开发者必须要解决的问题,即从应用停止到重启恢复服务这个阶段不能影响正常的业务请求,这使得无损下线成为应用生命周期中必不可少的一个环节 ...

  2. java args例子_Spring AOP中使用args表达式的方法示例

    本文实例讲述了Spring AOP中使用args表达式的方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchem ...

  3. java切点配置_Spring AOP中定义切点的实现方法示例

    本文实例讲述了Spring AOP中定义切点的实现方法.分享给大家供大家参考,具体如下: 一 配置 xmlns:xsi="http://www.w3.org/2001/XMLSchema-i ...

  4. java退出不报异常_如何优雅的处理异常(java)?

    这篇文章应该可以解答你的疑问. Java中异常提供了一种识别及响应错误情况的一致性机制,有效地异常处理能使程序更加健壮.易于调试.异常之所以是一种强大的调试手段,在于其回答了以下三个问题:什么出了错? ...

  5. docker 打包镜像_Spring Boot2 系列教程(四十一)部署 Spring Boot 到远程 Docker 容器

    不知道各位小伙伴在生产环境都是怎么部署 Spring Boot 的,打成 jar 直接一键运行?打成 war 扔到 Tomcat 容器中运行?不过据松哥了解,容器化部署应该是目前的主流方案. 不同于传 ...

  6. Mongodb网页管理工具,基于Spring Boot2.0,前端采用layerUI实现

    源码:https://github.com/a870439570/Mongodb-WeAdmin 项目介绍 Mongodb网页管理工具,基于Spring Boot2.0,前端采用layerUI实现. ...

  7. 优雅写mysql_如何写出优雅的代码?

    我 18 年在 PyCon 做过一次类似的分享 ,目的是如何写出优雅的代码.希望能部分回答这个问题,也希望与大家多多讨论.<聊聊编程原则>​zhuanlan.zhihu.com 要成为合格 ...

  8. java this$0_java中this$0的含义及用法

    java中this$0的含义及用法 (2012-01-19 22:43:33) 标签: 杂谈 java中this$0的含义及用法,具体case是这样的: 通过测试工具去探测界面UI上的控件FlatBu ...

  9. 【android】java.net.ConnectException: localhost/127.0.0.1:8080 - Connection refused

    调试中通过android simulator模拟器链接localhost或者127.0.0.1,因为我在电脑上面建立了apache,我的代码大概就是 URL url = new URL(urlStri ...

最新文章

  1. JavaScript深入理解对象方法——Object.entries()
  2. python列表list的基本性质
  3. 网络分析(带权并查集)
  4. Native Vlan(本征vlan)
  5. linux自动化测试脚本,linux iperf3 一键自动化测试脚本
  6. android中获取应用程序(包)的信息,Android中获取应用程序(包)的信息PackageManager的使用(一).doc...
  7. Chart.js报告
  8. 通达OA2013完美平台补丁以及手机短信服务配置
  9. 那些年Android开发遇到的坑(JNI 之 Illegal start byte 0xfe)
  10. matlab中ode45如何设置,如何使用Matlab中的ode45修正赋值错误(ode45函数的第488行)
  11. python字符串相减
  12. 2022牛客多校9 BTwo Frogs(概率DP)
  13. 亚马逊风控从哪些方面检测的?
  14. matlab中nargin函数的用法
  15. 项目中发生的一个奇葩问题
  16. 未来视频编码_设计编码营销并消费未来
  17. 一键生成舞曲编排的小程序(perl)
  18. A律折线与miu律折线
  19. 【python】利用python实现简单粒子群优化算法实例
  20. 双11秒杀场景设计,一看就懂!

热门文章

  1. html5泵站,HTML5 WebGL污水处理厂泵站自控系统
  2. channelunit.func.php,织梦系统全站伪静态配置过程详解
  3. Android 实现通知栏和进度条效果(适用于Android8.0以上)
  4. 伺服控制、步进控制和变频控制原理及区别
  5. 【大咖云集!】第四届计算机信息科学与应用技术国际学术会议(CISAT 2021)诚邀参与...
  6. 【精选】python入门算法题(一)
  7. 2017年十大重量级Bug赏金计划
  8. 常见数学符号字母拼音输入方法
  9. NLP电子病历后结构化软件系统对临床决策支持系统(CDSS)的支持(结构化数据的必要性)
  10. 数据库中一对一,一对多,多对多关系总结