优雅关机

导读

  • 语言:java
  • OS:Mac OS/Linux/Windows
  • 解决的问题:kill -X(-9除外,一般是-2或者-15等)时,让应用安全退出

实例代码

public class ShutdownTest {
    public static void main(String[] args) {
        System.out.println("Shutdown Test");

        Signal sg = new Signal("TERM");
        // 监听信号量
        Signal.handle(sg, signal -> {
            System.out.println("signal handle: " + signal.getName());
            System.exit(0);
        });
        // 注册关闭钩子
        Runtime.getRuntime().addShutdownHook(new Thread(() -> {
            // 在关闭钩子中执行收尾工作
            // 注意事项:
            // 1.在这里执行的动作不能耗时太久
            // 2.不能在这里再执行注册,移除关闭钩子的操作
            // 3 不能在这里调用System.exit()
            System.out.println("do shutdown hook");
        }));

        mockWork();

        System.out.println("Done.");
        System.exit(0);
    }

    // 模拟进程正在运行
    private static void mockWork() {
        //mockRuntimeException();
        //mockOOM();
        try {
            Thread.sleep(120 * 1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    // 模拟在应用中抛出RuntimeException时会调用注册钩子
    private static void mockRuntimeException() {
        throw new RuntimeException("This is a mock runtime ex");
    }

    // 模拟应用运行出现OOM时会调用注册钩子
    // -Xms10m -Xmx10m
    private static void mockOOM() {
        List list = new ArrayList();
        for (int i = 0; i < 1000000; i++) {
            list.add(new Object());
        }
    }
}
  • 控制台输出
Shutdown Test
  • 命令行查看pid
MacBook-Pro:**********$ jps
19641 ShutdownTest(关闭这个)
19092 Launcher
19094 Jps
MacBook-Pro:**********$kill -2 19641
  • 关闭系统后控制台输出
signal handle: TERM
do shutdown hook

Process finished with exit code 0
  • 参考:如何优雅地停止Java进程

spring 优雅停机

  • 版本:spring4.x
  • 原理:注册钩子函数
org.springframework.context.support.AbstractApplicationContext#registerShutdownHook
  • 实现DisposableBean接口并重写destroy方法,或者用@PreDestroy加在方法上面,用于销毁资源。
  • 参考:
    Tomcat优雅关闭之路
    spring注解之@PreDestroy的实现原理

springboot优雅停机

  • 参考:
    Springboot 2.x优雅关闭tomcat容器
    springboot优雅关机

tomcat优雅停机

相关文章

springboot 2.x 如何优雅的停止服务
Tomcat优雅关闭之路
Spring优雅停止服务的实现及原理分析
Spring Boot 2.3 新特性优雅停机详解
实现SpringBoot应用的优雅关机

你可能感兴趣的:(优雅关机)