JAVA优雅停机的实现
最近在项目中需要写一个数据转换引擎服务,每过5分钟同步一次数据。具体实现是启动engine server后会初始化一个ScheduledExecutorService和一个ThreadPoolExecutor线程池。schduel executor每过5分钟将dataTransformList中每一个tranform加入到线程池中运行。每一个数据转化器负责转换一组数据库数据。在执行过程中存在服务重启并且此时tranform正在转换数据并且数据没有全部操作完,此时希望正在执行的work能正常完成作业后再退出。优雅停机在服务重启,服务关闭显得比较重要了(尽管不能解决服务器突然断电导致服务瞬间不可用等原因)。
普通的优雅停机:当使用kill PID的时候jvm会收到服务停止信号并执行shutdownHook的线程
Runtime.getRuntime().addShutdownHook(new Thread() {
public void run() {
synchronized (EngineBootstrap.class) {
EngineServer.getInstance().shutdown();
running = false;
EngineBootstrap.class.notify();
}
}
});
EngineServer的shutdown方法
public void shutdown() {
this.transformExecutor.shutdown();
this.scheduledExecutorService.shutdown();
} ThreadPoolExecutor的shutdown方法会中断所有的空闲任务,保持正在运行中的任务执行完毕,但是由于kill PID一段时间后jvm就退出了导致正在执行的任务还没有完成就停止了。 改进后的优雅停机:
Signal sig = new Signal(getOSSignalType());
Signal.handle(sig, new SignalHandler() {
public void handle(Signal signal) {
synchronized (EngineBootstrap.class) {
EngineServer.getInstance().shutdown();
running = false;
EngineBootstrap.class.notify();
}
}
});
private static String getOSSignalType() {
return System.getProperties().getProperty("os.name").
toLowerCase().startsWith("win") ? "INT" : "USR2";
}
linux下通过kill -l查看 31 对应于 SIGUSR2 执行kill -31 PID, SignalHander会接收到signal number为31的信号并执行server shutdown,此时jvm并不会退出直到线程池所有正在执行的线程全部执行完毕才会安全退出。
java -jar data-engine-1.0.0-SNAPSHOT.jar
sh shutdown.sh
可以看到主线程安全退出后,线程池中的work执行完毕后java进程才结束
chenbanghongs-MacBook-Pro:nbugs-data-engine sylar$ java -jar target/data-engine-1.0.0-SNAPSHOT.jar.zip
1
2
3
4
5
31
优雅停机
主线程安全退出
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
transform
下载
data-engine-1.0.0-SNAPSHOT.jar.zip
shutdown.sh
JAVA优雅停机的实现的更多相关文章
- Java优雅停机
Java的优雅停机通常通过注册JDK的ShootDownHook实现,当系统接受到退出指令后,首先标记系统处于退出状态,不再接受新的消息,然后将积压的消息处理完,最后调用资源回收接口将资源销毁,最后各 ...
- 哦,这就是java的优雅停机?(实现及原理)
优雅停机? 这个名词我是服的,如果抛开专业不谈,多好的名词啊! 其实优雅停机,就是在要关闭服务之前,不是立马全部关停,而是做好一些善后操作,比如:关闭线程.释放连接资源等. 再比如,就是不会让调用方的 ...
- 你的Kubernetes Java应用优雅停机了吗?
Java 应用优雅停机 我们首先考虑下,一般在什么场景下数据会丢失呢? 升级服务时 pod重启时 服务器断电时 因为服务器断电属于极端情况,我们暂且不考虑.那就只有 Java 退出时我们要保证数据的完 ...
- Java 技术栈中间件优雅停机方案设计与实现全景图
欢迎关注公众号:bin的技术小屋,阅读公众号原文 本系列 Netty 源码解析文章基于 4.1.56.Final 版本 本文概要 在上篇文章 我为 Netty 贡献源码 | 且看 Netty 如何应对 ...
- dubbo-2.5.6优雅停机研究
不优雅的停机: 当进程存在正在运行的线程时,如果直接执行kill -9 pid时,那么这个正在执行的线程被中断,就好像一个机器运行中突然遭遇断电的情况,所导致的结果是造成服务调用的消费端报错,也有可能 ...
- Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题
Dubbo源码学习--优雅停机原理及在SpringBoot中遇到的问题 相关文章: Dubbo源码学习文章目录 前言 主要是前一阵子换了工作,第一个任务就是解决目前团队在 Dubbo 停机时产生的问题 ...
- Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现
Spring Boot 内嵌容器 Tomcat / Undertow / Jetty 优雅停机实现 Anoyi 精讲JAVA 精讲JAVA 微信号 toooooooozi 功能介绍 讲解java深层次 ...
- ShutdownHook- Java 优雅停机解决方案
想象一下,如果你现在刚好在 word 上写需求文档,电脑突然重启.等待开机完成,你可能会发现写了一个小时文档没有保存,就这么没了... 一个正在运行 Java 应用如果突然将其停止,影响不止数据丢失, ...
- Dubbo 优雅停机演进之路
一.前言 在 『ShutdownHook- Java 优雅停机解决方案』 一文中我们聊到了 Java 实现优雅停机原理.接下来我们就跟根据上面知识点,深入 Dubbo 内部,去了解一下 Dubbo 如 ...
随机推荐
- 将sublimeText添加到鼠标右键菜单栏
将sublimeText添加到鼠标右键菜单栏主要是写一个注册表的文件,将这个注进去,首先你需要清楚你的sublimeText软件的安装路径,然后改一下下面这段代码就可以了 Windows Regist ...
- IO多路复用深入浅出
前言 从零单排高性能问题,这次轮到异步通信了.这个领域入门有点难,需要了解UNIX五种IO模型和 TCP协议,熟练使用三大异步通信框架:Netty.NodeJS.Tornado.目前所有标榜异步的通信 ...
- 桥梁模式(Bridge Pattern)
桥梁模式是对象的结构模式.又称为柄体(Handle and Body)模式或接口(Interface)模式.桥梁模式的用意是“将抽象化(Abstraction)与实现化(Implementation) ...
- SQL Server中INNER JOIN与子查询IN的性能测试
这个月碰到几个人问我关于"SQL SERVER中INNER JOIN 与 IN两种写法的性能孰优孰劣?"这个问题.其实这个概括起来就是SQL Server中INNER JOIN与子 ...
- myEclipse hibernate连接数据库配置方法
Access数据库:
- Debian系统简要说明
Debian这个是我最喜欢也是比较熟悉的一个系统了,BD下做个简要说明 一,APT以及dpkg常见用法如下:功能具体语句 软件源设置 /etc/apt/sources.list 更新软件源数据 ...
- 用SIM900上传云端数据(原创KEKE)
依次发送如下几个命令到SIM900A模块: AT+CGCLASS="B" AT+CGDCONT=1,"IP","CMNET" AT+CG ...
- 面试(4)-spring-Spring面试题和答案
1:69道Spring面试题和答案 转自:http://ifeve.com/spring-interview-questions-and-answers/ 目录 Spring 概述 依赖注入 Spri ...
- java 上传2(使用java组件fileupload和uploadify)
项目关键包和插件
- Http学习之使用HttpURLConnection发送post和get请求(2)
接上节Http学习之使用HttpURLConnection发送post和get请求 本节深入学习post请求. 上 节说道,post请求的OutputStream实际上不是网络流,而是写入内存,在ge ...