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方法

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

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

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

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

DefaultLifecycleProcessor-onClose() 方法做了什么

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

isRunning()为ture才会被调用

结论

所以要实现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.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@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'

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值