基于JVM的ShutdownHook端口冲突优雅关闭

服务启动端口冲突解决方案

报错信息:Address already in use

Step1:修改启动端口执行server.port

Step2:lsof -i:端口 或 netstat -anp|grep 端口 ==>找到启动端口对应的服务进程pid
使用kill -9 pid 执行进程pid强杀

强杀严重问题讲解

比如一些服务或对象在进行通道连接,文件输入输入出等。这种情况是不能使用强杀的。强杀就类似电脑你突然把电拔了。你想啊,服务器正在修改一些文件,你突然强杀,这些文件就没有保存

Step3: kill -15配合ShutdownHook实现优雅关闭

kill命令 Linux 中 kill 指令负责杀死进程,其后可以紧跟⼀个数字,代表信号编号(Signal)

kill -l
HUP INT QUIT ILL TRAP ABRT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH POLL
PWR SYS

Java进程优雅关闭的意义

关闭 socket 链接

清理临时⽂件

发送消息通知给订阅⽅,告知⾃⼰下线

各种资源的释放 jerkins钩⼦ ,往git提交代码==》执⾏了⾃动化构建==》服务重启 dubbo spi的钩子

代码验证

Step1:启动类添加

public class CouponAppApplication {

    public static void main(String[] args) {
        SpringApplication.run(CouponAppApplication.class, args);

        //执行 kill -15执行 ShutdownHook
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
            @Override
            public void run() {
                System.out.println("执行JVM ShutdownHook");
            }
        }));
    }

}

Step2:配置类

@Component
public class TestDisposeableBean implements DisposableBean {


    @Override
    public void destroy() throws Exception {
        System.out.println("测试TestDisposeableBean已经销毁");
    }
}

启动项目后使用 kill -15 pid杀死进程。查看结果

如果项目中有使用zookeeper,还会关闭zookeeper的一个线程。说明zookeeper也是spring shutdownhook的一种实现
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/q736317048/article/details/113662583
今日推荐