背景
最近收到一个新需求,需要充kafka队列中那消息解析写到es中。要求不能漏写数据,或者重复写数据。‘
问题
如果程序中途需要手动停止,就需要把已经从kafka中拿到的数据,写进了es 才能停止程序。否则就会漏写数据或者重复写入数据
解决
钩子函数
ShutdownHook只是一个已初始化但为启动的线程。当JVM开始执行关闭序列时,它才开始已某种随机程序注册和并行执行shutdown hooks。
注意 这个对 kill -9 {pid} 无效,对 kill -15 及 Control +C 有效
1 | //注册钩子函数 |
SignalHandler
实现sun.misc.SignalHandler 接口
1 | public class SignalHandlerImp implements SignalHandler { |
1 |
|
总结
jvm 关闭的几种方式
我们可以通过 钩子函数来 处理 正常关闭以及异常关闭的收尾工作。SignalHandler 只能处理正常关闭的收尾工作。所以钩子函数的应用要广泛一点的。