Netty篇之如何优雅的关服

news2024/9/21 12:40:18

强制关服的危害

linux中关服如果我们使用

kill -9 pid号

或者在windows中使用

taskkill /f /pid pid号

来关服的话,相当于是突然断电的方式,会导致如下几种情况。

  1. 缓存中的数据丢失
  2. 正在进行文件的写操作,没有更新完成,突然退出会导致文件损坏
  3. 线程消息队列中的消息丢失
  4. 句柄资源没有及时释放等其他问题

如何优雅退出

方法1.使用JDK的ShutdownHook的方式来实现。调用System.exit(0)会调用到这个注册的方法。同时是用Kill -15 也是会调用这个钩子方法。

 //第一种方式注册JDK的ShutdownHook来实现优雅关机
 Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
      public void run() {
          System.out.println("ShutdownHook关服了");
      }
  },"shutdown"));

方法2.使用信号量的方式来实现。具体的逻辑如下
在这里插入图片描述
具体的代码实现如下

        //第二中方式:监听信号量并注册SignalHandler的方式来是优雅关服
        String type = System.getProperties().getProperty("os.name").toLowerCase().startsWith("win")?"INT":"TERM";
        Signal sig = new Signal(type);
        SignalHandler shutdownHandle = new MySignalHandler();
        Signal.handle(sig,shutdownHandle);
public class MySignalHandler implements SignalHandler {
    public void handle(Signal signal) {
        System.out.println("通过信号量的方式来关闭服务器");
        System.exit(0);
    }
}

上面的方法可以使用Ctrl+C来触发。

注意:这里使用的 System.exit(0);可以触发方法1中的钩子方法。因此可以两个方法都写到同一个项目中

方案1和2的劣势

通过注册ShutdownHook退出要注意的问题如下

  • JVM崩溃、无法接收信号量和Kill -9 pid等,是不会被执行的
  • 多个ShutdownHook存在时,是无法保证他们的执行顺序
  • JVM关闭期间不能动态添加或者去除ShutdownHook
  • 不能在ShutdownHook中调用System.exit(),它会卡住JVM,导致进程无法退出

通过注册SignalHandler实现的退出要注意如下

  • 要避免阻塞操作,否则会导致已经注册的ShutdownHook无法执行,系统无法退出

Netty优雅退出

netty优雅退出设计到的主要操作和资源对象
在这里插入图片描述
在这里插入图片描述

Netty优雅退出源码分析

优雅退出的入口是如下代码

group.shutdownGracefully();

我们跟进去看看都做了什么神秘的操作。


workerGroup.shutdownGracefully();
 |-io.netty.util.concurrent.AbstractEventExecutorGroup#shutdownGracefully
	|-io.netty.util.concurrent.MultithreadEventExecutorGroup#shutdownGracefully  //这里是将多个子工作进程进行关服
		|-io.netty.util.concurrent.SingleThreadEventExecutor#shutdownGracefully
		
上述的操作完成之后将状态改为了 ST_SHUTTING_DOWN

    private static final int ST_NOT_STARTED = 1;
    private static final int ST_STARTED = 2;
    private static final int ST_SHUTTING_DOWN = 3;
    private static final int ST_SHUTDOWN = 4;
    private static final int ST_TERMINATED = 5;
	

由于NioEventLoop中有一个无线循环的操作因此进来这里
io.netty.channel.nio.NioEventLoop#run
	|-io.netty.channel.DefaultSelectStrategy#calculateStrategy  //选择策略(选择的是NioEventLoop、EpollEventLoop还是KQueueEventLoop)
	|-io.netty.channel.nio.NioEventLoop#processSelectedKeys 处理多了选择器的Key
		|-io.netty.channel.AbstractChannel.AbstractUnsafe#close(io.netty.channel.ChannelPromise) 
		//关掉channel
		//包括:
		//将发送消息队列清空,不在允许发送新的消息
		//判断当前链路是否还有消息正在发送,有则将SelectionKey的去注册操作封装成Task放到eventLoop中稍后再执行
	|-io.netty.channel.nio.NioEventLoop#closeAll //把注册在selector中的所有的Channel都关闭掉
	|-io.netty.util.concurrent.SingleThreadEventExecutor#confirmShutdown //检查是否已关闭,若关闭成功则退出线程
	//操作如下:
	//1.光雕所有的定时器任务ScheduledFutureTask
	//2.轮询任务队列中的所有任务,并执行他们
	//3.运行所有的ShutdownHook任务

上面就是netty关服的一些关键类以及方法。方便后续自己查找。这是我跟踪Netty关服的一些记录。希望对大家有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/68155.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

技术分享 | Redis 集群架构解析

作者:贲绍华 爱可生研发中心工程师,负责项目的需求与维护工作。其他身份:柯基铲屎官。 本文来源:原创投稿 *爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。 一、集群架构的一…

决策树算法中处理噪音点

目录 如何解决?——采用剪枝的方法。 预剪枝 后剪枝 如果训练集中存在噪音点,模型在学习的过程总会将噪音与标签的关系也学习进去,这样就会造成模型的过拟合化,也就是模型在训练集的分类效果很好,在未知数据上处理效…

python快速实现2048小游戏

《2048》是一款比较流行的数字游戏,最早于2014年3月20日发行。原版2048首先在GitHub上发布,原作者是Gabriele Cirulli,后被移植到各个平台。这款游戏是基于《1024》和《小3传奇》的玩法开发而成的新型数字游戏。 操作指南: 每次…

景区票务系统毕业设计,景区售票系统设计与实现,旅游售票系统毕业设计源码分析

项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于java的景区景点预约购票系统,整体使用javaMySql的B/S架构,技术上采用了springboot框架;通过后台添加景区资讯、景点介绍,管理用户订单;用户通过…

Vue怎么通过JSX动态渲染组件

一、明确需求 有一组数组结构如下: const arr [ { tag: van-field }, // 输入框{ tag: van-cell }, // 弹出层{ tag: van-stepper } // 步进器 ] 想通过循环arr,拿到tag渲染对应的组件。 下面我们分析如何写才是最优。 二、进行分析 2.1 v-if走天…

JavaScript期末大作业:基于HTML+CSS+JavaScript黑色的bootstrap响应式企业博客介绍模板

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

JTable详细介绍

目录 一、基本表格 二、修改列宽并显示列的名称 三、使用AbstractTableModel抽象类存储数据 一、基本表格 显示一个Table需要两组数据 1. 一维数组: String[]columnNames 表示表格的标题 2. 二维数组: String[][] heros 表格中的内容 默认情况下&…

使用openssl工具生成CSR文件

使用OpenSSL工具生成CSR文件 登录服务器。 安装OpenSSL工具。 执行以下命令,生成CSR文件。 openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout [$Key_File] -out [$OpenSSL_CSR] 说明 -new:指定生成一个新的CSR文件。 -nodes:指定…

WindowsNT下的OpenGL

三、WindowsNT下的OpenGL 3.1、Windows NT下的OpenGL函数   如前面的章节所述,Windows NT下的OpenGL同样包含100多个库函数,这些函数都按一定的格式来命名,即每个函数都以gl开头。Windows NT下的OpenGL除了具有基本的OpenGL函数外&#xf…

威马汽车欲曲线上市:沈晖已提前持股并任职,销量垫底、员工降薪

12月5日,港交所上市公司Apollo出行(HK:00860)发布公告称,该公司拟收购一家从事智能电动车的公司,目标公司的业务涵盖一系列配备先进技术的智能电动车,目标客户为中国年轻且精通技术的用户(特别是…

小迪-day14(注入类型之提交注入)

1、参数提交注入 1.1 明确参数类型 数字,字符,搜索,JSON等1.2 明确提交方式 GET, POST,COOKIE,REQUEST,HTTP头等可能有些网站是以Request的方式接受参数,所以GET和POST都行 注入的地方可能在User-Agent、cookie上&a…

辽宁熤星传媒文化:抖音原创特效怎么做?

现在很多小伙伴在家都基本上会去找一些副业来做,或者是一些赚钱的方法,要知道,抖音其实还是有很多赚钱的机遇在里面的,那么大家拍抖音都是需要去使用特效的,那么抖音特效应该怎么做呢?跟着辽宁熤星传媒小编…

探索可观测性:AIOps中的时序数据应用

01. 背景 随着科技的发展,时序数据在我们的认知中占据越来越多的位置,小到电子元件在每个时刻的状态,大到世界每天的新冠治愈人数,一切可观测,可度量,可统计的数据只要带上了时间这个重要的因素就会成为时…

Antlr4 快速入门 - 编写语法解析器

Antlr全称(ANother Tool for Language Recognition),Antlr4是一款强大的语法分析器生成工具,推特,Haddop,Oracle等各大知名公司在用到了Antlr来构建自己的语言处理类项目。 一门语言的正式描述称为语法(grammar),Antl…

计算机考研报名人数下降一半!211北京科技大学计算机报考人数公布!

北京科技大学是一所211大学,计算机学科评估B,计算机实力在211大学中还算不错。前段时间,北京科技大学公布了23考研的报考人数,而且详细到了各个专业的人数:北京科技大学2023年硕士研究生各招生专业准考人数统计表https…

PyQt5页面跳转问题及解决方式

问题1:如何实现页面间跳转 主要定义MainWindow类和Actions.py class MainWindow: Actions.py: 问题2:实现定义函数传参功能 大胆修改,将定义函数的参数值改为a;使用函数处将参数加上: 运行&…

腾讯云动态公网IP绑定域名实现内网服务器公网穿透

公众号推广: 目前CSDN进行VIP可见,文章可在微信公众号进行免费的阅读。 文章内容经过认证实践,比较的清晰易懂,适合初次接触的人员。 目录 公众号推广: 需求场景: 解决方案: 实现方案:

1.5.4 HDFS 客户端操作-hadoop-最全最完整的保姆级的java大数据学习资料

文章目录1.5.4 HDFS 客户端操作1.5.4.1 Shell 命令行操作HDFS1.5.4.2 JAVA客户端1.5.4.2.1 客户端环境准备1.5.4.2.2 HDFS的API操作1.5.4.2.2.1 上传文件1.5.4.2.2.2 下载文件1.5.4.2.2.3 删除文件/文件夹1.5.4.2.2.4 查看文件名称、权限、长度、块信息1.5.4.2.2.5 文件夹判断1…

Letbook Cookbook题单——数组2

Letbook Cookbook题单——数组2 39. 组合总和 难度中等 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的 所有 不同组合 ,并以列表形式返回。你可以按 任意顺序 返回这些组合。…

Qgis加载arcgis的gdb格式数据

方式1:文件浏览器打开可直接看到图层,拖到可视区域即可。 方式2:gdb文件夹拖到可视区域即可。 方式3:图层-矢量-目录 该gdb可能没有坐标信息,需要跟甲方询问或者自己尝试