SpringBoot优雅退出

目录

 

概念

原理

SpringBoot实现源码分析

查看源码我们发现会调用 Lifecycle 的stop()方法  或者调用 SmartLifecycle的stop(Runnable var1)方法且

isRunning()为ture才会被调用

结论


 

概念

jvm有shutdownHook机制,中文习惯叫优雅退出。相当于在linux系统中执行SIGTERM(kill -15 或者 svc -d)时退出前执行的一些操作.

原理

以linux系统为例说明:

进程在响应kill -15 pid命令进行关闭操作时默认发送SIGTERM信号至指定进程/进程组。如果进程没有捕获该信号的逻辑,则SIGTERM的作用是终止进程。而registerShutdownHook=true说明有注册的事件需要捕获该信号,先执行相应的逻辑再进行终止。

SpringBoot实现源码分析

查看SpringApplication类源码,registerShutdownHook属性默认是true,刷新上下文的时候会调用上下文的registerShutdownHook方法

SpringBoot优雅退出

SpringBoot优雅退出

SpringBoot优雅退出

查看registerShutdownHook方法的实现 AbstractApplicationContext-registerShutdownHook,我们发现会初始化

shutdownHook线程并注册一个jvm的shutdownHook钩子函数。jvm退出前会执行这个钩子函数。

SpringBoot优雅退出

doclose做了什么,查看源码,我们发现会调用lifecycleProcessor的onclose方法。

SpringBoot优雅退出

lifecycleProcessor是什么,查看源码,其实就是DefaultLifecycleProcessor

SpringBoot优雅退出

DefaultLifecycleProcessor-onClose() 方法做了什么

SpringBoot优雅退出

SpringBoot优雅退出

SpringBoot优雅退出

SpringBoot优雅退出

查看源码我们发现会调用 Lifecycle 的stop()方法  或者调用 SmartLifecycle的stop(Runnable var1)方法且

isRunning()为ture才会被调用

SpringBoot优雅退出

SpringBoot优雅退出

结论

所以要实现SpringBoot优雅退出只要实现Lifecycle接口的 -stop()或 SmartLifecycle 接口的stop(Runnable var1)方法就可以。

test验证

@Component
public class LifecycleTest implements Lifecycle {

    @Override
    public void start() {

    }

    @Override
    public void stop() {
        System.out.println("LifecycleProcessorTest stop()");
    }

    @Override
    public boolean isRunning() {
        return true;
    }
}

2019-06-27 13:23:08.493 INFO 50993 --- [ Thread-21] ationConfigEmbeddedWebApplicationContext : Closing org.springframework.boot[email protected]45ca843: startup date [Thu Jun 27 13:22:52 CST 2019]; root of context hierarchy
2019-06-27 13:23:08.499 INFO 50993 --- [ Thread-21] o.s.c.support.DefaultLifecycleProcessor : Stopping beans in phase 0
LifecycleProcessorTest stop()
2019-06-27 13:23:08.499 INFO 50993 --- [ Thread-21] o.s.j.e.a.AnnotationMBeanExporter : Unregistering JMX-exposed beans on shutdown
2019-06-27 13:23:08.501 INFO 50993 --- [ Thread-21] o.s.s.c.ThreadPoolTaskScheduler : Shutting down ExecutorService 'taskScheduler'