时至今日,Docker在项目中的应用越来越普遍了,但往往会遭遇一些麻烦,比如说,有几个请求至Docker中的服务,发起了事务处理业务,但每个事务完成可能需要1-5分钟,而此时我们正要将Docker停机准备发布新版本,那如何在不影响当前业务执行的停止服务呢?有人会说,用docker stop,默认10秒延迟关停,加个延时参数-t 300,完美!有一说一,确实,但问题又来了,当前服务中的业务处理满足了,如何防止新的请求产生?所以,如何优雅地停机成了开发者关注的问题。好了,不多BB,直接开整铁汁们。

思路:执行docker stop -t 360,Java服务会收到容器发出的SIGTERM信号,监听到此信号并执行相关操作,如注销MQ或Eureka,关闭Controller或ThreadPool等。

先贴一段代码,关于如何监听SIGTERM,并关闭RabbitMQ。

public classXXXApplication {************

private static boolean stopHandle = false;

public static voidmain(String[] args) {

SpringApplication springApplication= new SpringApplication(XXXApplication.class);************ApplicationContext context=springApplication.run(args);

ApplicationParam appParam= context.getBean(ApplicationParam.class);

// 监听信号

handleSignal("TERM", context);

************

}private static void handleSignal(String name, ApplicationContext context) {

Signal signal = new Signal(name);

signal.handle(signal,Signal -> {

logger.info("signal received: "+ signal.getName());

if("TERM".equals(signal.getName())){

shutdown(context);

stopHandleApi = true;

}

});

}

private static void shutdown(ApplicationContext context) {

// 关闭rabbit mq

logger.info("shutdown rabbitMQ listener! ");

RabbitListenerEndpointRegistry rer = context.getBean(RabbitListenerEndpointRegistry.class);

rer.stop();

}

}

这里将stopHandle这个静态常量设为true的目的是表明程序即将停止,这样也能在其它地方应用,比如,写一个拦截器,当接收到新的请求时拦截,判断stopHandle是否为true,如果是则说明服务要停止了,不再接受新请求,同时返回404给客户端。

public class RestApiInterceptor extendsHandlerInterceptorAdapter {private static final Logger logger = LogManager.getLogger(RestApiInterceptor.class);

@Overridepublic booleanpreHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throwsException {

logger.info("isStopHandleApi = "+FintechEkycApplication.isStopHandleApi());if(ShortenLinkSysApplication.isStopHandleApi()){

response.setStatus(404);

response.setContentType("text/html");

response.setCharacterEncoding("UTF-8");

response.getWriter().println("application is stopping! Please wait minutes and request after it restart !");return false;

}else{return true;

}

}

测试效果如图:

总结:如果希望代码更优雅一点可以利用事件驱动,写个继承TomcatConnectorCustomizer的类来处理像Thread Pool、Web servlet等。这里就不整活了铁汁们,今天就到这里,拜拜。

java关闭服务_实现优雅地关闭Docker中的java服务相关推荐

  1. mac电脑配置java环境变量_教你在Mac系统中配置JAVA环境变量的方法

    Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.下面向大家介绍Mac电脑上如何配置Java ...

  2. nginx没有worker进程_如何优雅地关闭worker进程?

    点击上方"武培轩",选择"设为星标" 技术文章第一时间送达! 之前我们讲解 Nginx 命令行的时候,可以看到 Nginx 停止有两种方式,分别是 nginx ...

  3. java 调用 docker 中的 HBase 服务 卡死 不报错 不报异常 卡着不动 但 服务ip是能ping通

    问题现象 最近接了一个需求,要在本地(win)环境运行位于虚拟机中搭建的伪分布 HBase 服务(linux) 在 win 环境中,浏览器 打开 HBase 的 16010 web页面是没有问题的,这 ...

  4. Docker中的Java内存消耗优化以及我们如何使用Spring Boot

    ---- / BEGIN/ ---- 如果您的Docker容器占用太多内存而无法达到最佳性能,请阅读下文以了解一个团队如何找到解决方案. 最近,我所在的团队在部署我们的微服务(AWS上Docker中的 ...

  5. 实例解读:如何减少Docker中的Java内存消耗

    最近,我所在的团队面临着部署微服务(Java+SpringMVC in Docker on AWS)的问题.主要问题是,很多非常轻巧的应用程序消耗了太多的内存.因此,我们经过多方尝试找到了在Docke ...

  6. java如何关闭线程池_如何优雅的关闭Java线程池

    ⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...

  7. java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池

    每一个线程都会占用系统资源,因此线程池的关闭与清理同样重要,本文介绍我们如何优雅地关闭线程池. 一. ExecutorService中关闭线程池的方法 1. shutdown() 停止接收新任务,原来 ...

  8. 准考证打印系统关闭怎么办_准考证打印系统关闭怎么办_公务员考录专题网站...

    准考证打印系统关闭怎么办_公务员考录专题网站由国家公务员考试网考试快讯栏目由提供,更多关于国考准考证打印时间,国家公务员考试考试快讯的内容,请关注国家公务员考试网/广东公务员考试网! 请注意!23日0 ...

  9. 准考证打印系统关闭怎么办_准考证打印系统关闭怎么办_广东省人力资源和社会保障厅网站...

    准考证打印系统关闭怎么办_广东省人力资源和社会保障厅网站,更多关于广东事业单位考试准考证打印,事业单位准考证打印的内容,请关注广东事业单位考试网/广东人事考试网! 本次公开招聘考试采取"笔试 ...

最新文章

  1. 【知乎热议】如何看待swin transformer成为ICCV2021的 best paper?
  2. 主动,是因为在乎,不再联系,是因为感到自己多余
  3. git ssh配置完后拉取代码_CentOS6自带git版本需要用户名才能拉取代码
  4. 全面搞定jive3.1.1
  5. linux ppp漏洞,Linux下ppp拨号的实现(Arm)
  6. 1.5编程基础之循环控制 21 角谷猜想
  7. mysql控制台操作
  8. python类的初始化方法___python类的初始化方法
  9. webshell文件下载器
  10. Python 爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...
  11. 树莓派外设、模块、传感器 —— 数码管(F3461BH)
  12. java递归删除文件夹_如何使用递归删除Java中的目录/文件夹
  13. python warning_warning最新:Python 忽略warning的输出方法_爱安网 LoveAn.com
  14. cups 2.4.1编译办法
  15. CSS 3之美化表格样式
  16. 学习笔记12--智能驾驶安全设计案例
  17. qpython3安装kivy_kivy学习之路:kivy开发环境架设--- windows篇
  18. 解决Tomcat中文乱码问题
  19. 记单词01-vict, vinc(胜利,征服)
  20. Android UI设计 下拉菜单Spinner用法 动态添加删除Spinner菜单项

热门文章

  1. dudu注意:这个可能是bug吧?
  2. ffmpeg推流 av_dict_set 参数设置解析(降低延时、处理花屏、改善画面质量)(实时更新)
  3. C++11新特性之std::function<>
  4. Java基础练习之流程控制(一)
  5. android在线查看源码工具
  6. Android objdump/nm/readelf使用
  7. shell死循环(whilefor)
  8. Android odex反编译为dex
  9. MongoDB 之聚合函数查询统计
  10. 云服务器网站301重定向跳转有什么作用?