java关闭服务_实现优雅地关闭Docker中的java服务
时至今日,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服务相关推荐
- mac电脑配置java环境变量_教你在Mac系统中配置JAVA环境变量的方法
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征.下面向大家介绍Mac电脑上如何配置Java ...
- nginx没有worker进程_如何优雅地关闭worker进程?
点击上方"武培轩",选择"设为星标" 技术文章第一时间送达! 之前我们讲解 Nginx 命令行的时候,可以看到 Nginx 停止有两种方式,分别是 nginx ...
- java 调用 docker 中的 HBase 服务 卡死 不报错 不报异常 卡着不动 但 服务ip是能ping通
问题现象 最近接了一个需求,要在本地(win)环境运行位于虚拟机中搭建的伪分布 HBase 服务(linux) 在 win 环境中,浏览器 打开 HBase 的 16010 web页面是没有问题的,这 ...
- Docker中的Java内存消耗优化以及我们如何使用Spring Boot
---- / BEGIN/ ---- 如果您的Docker容器占用太多内存而无法达到最佳性能,请阅读下文以了解一个团队如何找到解决方案. 最近,我所在的团队在部署我们的微服务(AWS上Docker中的 ...
- 实例解读:如何减少Docker中的Java内存消耗
最近,我所在的团队面临着部署微服务(Java+SpringMVC in Docker on AWS)的问题.主要问题是,很多非常轻巧的应用程序消耗了太多的内存.因此,我们经过多方尝试找到了在Docke ...
- java如何关闭线程池_如何优雅的关闭Java线程池
⾯试中经常会问到,创建⼀个线程池需要哪些参数.线程池的工作原理,却很少会问到线程池如何安全关闭的. 也正是因为⼤家不是很关注这块,即便是⼯作三四年的⼈,也会有因为线程池关闭不合理,导致应用⽆法正常st ...
- java 关闭阻塞线程池_如果优雅地关闭ExecutorService提供的java线程池
每一个线程都会占用系统资源,因此线程池的关闭与清理同样重要,本文介绍我们如何优雅地关闭线程池. 一. ExecutorService中关闭线程池的方法 1. shutdown() 停止接收新任务,原来 ...
- 准考证打印系统关闭怎么办_准考证打印系统关闭怎么办_公务员考录专题网站...
准考证打印系统关闭怎么办_公务员考录专题网站由国家公务员考试网考试快讯栏目由提供,更多关于国考准考证打印时间,国家公务员考试考试快讯的内容,请关注国家公务员考试网/广东公务员考试网! 请注意!23日0 ...
- 准考证打印系统关闭怎么办_准考证打印系统关闭怎么办_广东省人力资源和社会保障厅网站...
准考证打印系统关闭怎么办_广东省人力资源和社会保障厅网站,更多关于广东事业单位考试准考证打印,事业单位准考证打印的内容,请关注广东事业单位考试网/广东人事考试网! 本次公开招聘考试采取"笔试 ...
最新文章
- 【知乎热议】如何看待swin transformer成为ICCV2021的 best paper?
- 主动,是因为在乎,不再联系,是因为感到自己多余
- git ssh配置完后拉取代码_CentOS6自带git版本需要用户名才能拉取代码
- 全面搞定jive3.1.1
- linux ppp漏洞,Linux下ppp拨号的实现(Arm)
- 1.5编程基础之循环控制 21 角谷猜想
- mysql控制台操作
- python类的初始化方法___python类的初始化方法
- webshell文件下载器
- Python 爬取近十万条程序员招聘数据,告诉你哪类人才和技能最受热捧! | 原力计划...
- 树莓派外设、模块、传感器 —— 数码管(F3461BH)
- java递归删除文件夹_如何使用递归删除Java中的目录/文件夹
- python warning_warning最新:Python 忽略warning的输出方法_爱安网 LoveAn.com
- cups 2.4.1编译办法
- CSS 3之美化表格样式
- 学习笔记12--智能驾驶安全设计案例
- qpython3安装kivy_kivy学习之路:kivy开发环境架设--- windows篇
- 解决Tomcat中文乱码问题
- 记单词01-vict, vinc(胜利,征服)
- Android UI设计 下拉菜单Spinner用法 动态添加删除Spinner菜单项