首页 > 编程语言 >Java游戏服务器之优雅停服

Java游戏服务器之优雅停服

时间:2023-09-18 22:48:34浏览次数:35  
标签:Java SpringBoot 处理 钩子 kill 关闭 服务器 停服

一、写随笔的原因:

最近项目开发中,停服的时候发现停服的时候,日志无法打印,看了下原因,是因为项目使用了SpringBoot中的logback,无法控制日志关闭在项目内部停服逻辑之前关闭。研究之后,整理下关于优雅停服的相关处理

二、具体的内容:

1. 什么是优雅停服

让应用程序处理完正在运行的逻辑,保存内存中的数据到磁盘等等。即让程序处理完相应的操作在通知JVM去关闭进程。

2. 处理方式

1.可以通过 Runtime.getRuntime().addShutdownHook(Thread hook):在jvm中增加一个关闭的钩子,当jvm关闭的时候,会执行系统中已经设置的所有通过方法addShutdownHook添加的钩子,当系统执行完这些钩子后,jvm才会关闭。

产生的问题:如果是依赖于SpringBoot构建的项目,是先调用的SpringBoot的停服处理可能无法和你的内部处理逻辑同时进行,无法合理的安排顺序

代码如下:

 

 

2.利用操作系统内核提供的信号机制来实现

我们使用 kill -l 命令查看下 kill 命令可以向进程发送哪些信号:

 

 一般我们调用kill命令走的是15 SIGTERM,所以我们可以利用SignalHandler来处理,要注意Window和Linux的停服信号量是不一样的代码如下:

处理完服务器停服的内部逻辑,就可以调用JVM正常关闭了,即System.exit(0);这时候才会调用SpringBoot的关闭逻辑

三、总结:

比较推荐使用信号量在做停服的相关处理,这样比停服钩子更加的可控。本文写的比较匆忙,更偏向于应用,后面会参考其他文章进行更详细的补充

 

标签:Java,SpringBoot,处理,钩子,kill,关闭,服务器,停服
From: https://www.cnblogs.com/black-fact/p/17713271.html

相关文章

  • Java中的常见异常
    Java语言中包含了许多内置异常,这些异常可以分为两大类:检查型异常(CheckedExceptions)和非检查型异常(UncheckedExceptions)。检查型异常是在编译时必须被处理的异常,如IOException、ClassNotFoundException等。非检查型异常是运行时异常,如NullPointerException、ArrayIndexOutOfBounds......
  • 巧用枚举解决业务场景的 Switch 语句—Java 实践
    巧用枚举解决业务场景的Switch语句——Java实践Switch语句是一种常见的流程控制语句,用于根据不同的条件执行不同的代码块。然而,当业务场景变得复杂时,使用大量的Switch语句可能导致代码冗长、难以维护和扩展。本文将介绍如何巧妙地使用枚举类型来优化和简化Switch语句的使......
  • 利用U盘重装ubuntu系统及惠普Z820服务器配置过程
    说几句无关的话:下列教程是我在组内负责装机后写的文档,感觉可以参考,所以分享给大家  以下是安装流程装显卡拆开机箱内的各种大块保护壳,直接扣住绿色地方进行拉拔等操作,不要太用力,不敢下手可以问组内人参考硬件茶谈装机教程;也可查询其他教程,一个插槽,卡扣拉开按上显卡,卡扣自动......
  • 使用ztncui配置私有化zerotier服务器
    众所周知,Zerotier-One是一个非常好的组建虚拟局域网的工具,可以以p2p的方式穿透NAT网络进行连接。但是在使用中也仍然存在着一些瑕疵,主要就是以下两点:因为Zerotier官方提供的中心节点(planet节点)全部都在国外,所以更新路由表的时候,通常会消耗较长的时间,甚至可能失败;官方免费版......
  • JAVA高级架构师
    JAVA高级架构师技术包含:SpringBoot3.0,SpringCloudAlibaba,JDK11~19,Spring6,IOC,AOP,JavaWeb,SpringMVC,Mybatis,Docker,k8s,Devops,Vue3.0,Nginx,Redis7,MongoDB,JDBC,ShardingJDBC,Zookeeper,Dubbo,Activiti7,ES8,RabbitMQ,Redisson,Shiro,Paas,Neo4j,Kafka,Mycat,Tcp,ELK,SpringDa......
  • 9.18日课堂上java练习
    1importjava.util.ArrayList;2importjava.util.Random;3importjava.util.Scanner;4importjava.util.ArrayList;5importjava.util.Random;6importjava.util.Scanner;78publicclassCountdownThreadextendsThread{9privatest......
  • [JavaScript] JavaScript的时间与时区
    0序言第1章节,原创,主要关注:JS的时间、时区国际化问题第2章节,主要来自于第1篇参考文献(系对第1章节的基础知识的夯实)1JavaScript时间、时区的国际化(案例)本案例等同于问题:JavaScript从浏览器根据不同时区获取时间的问题假定现在有两台Windows笔记本电脑。Step1设置......
  • JavaWeb基础
    JavaWeb基础概念:JavaWeb,是用Java技术来解决相关web互联网领域的技术栈。web分为静态web和动态web,静态web包括css和html这种,设定后就不会变了,动态简单理解就是数据会随时改变,比如淘宝,每个人在不同时间不同地点看到的信息是不一向的,对于java来讲,动态web资源开发技术就统称为javaw......
  • 使用JavaScript或PHP限制垃圾邮件信息
    要限制垃圾邮件信息,可以使用JavaScript和PHP来执行以下方法:使用JavaScript限制垃圾邮件信息:表单验证:通过在表单提交之前使用JavaScript对输入的数据进行验证。可以检查电子邮件地址的格式、必填字段的输入以及其他特定规则。验证码:在表单中添加验证码字段,要求用户输入生成的验证码......
  • 无涯教程-JavaScript - PRODUCT函数
    描述PRODUCT函数将所有作为参数给出的数字相乘并返回乘积。如,如果单元格A1和A2包含数字,要将这两个数字相乘,可以使用以下公式=产品(A1,A2)这与与(*)数学运算符相乘相同。即=A1*A2当您需要将多个单元格相乘时,PRODUCT功能非常有用。Example=产品(A1:A3,C1:C3)这和=......