目录
查看源码我们发现会调用 Lifecycle 的stop()方法 或者调用 SmartLifecycle的stop(Runnable var1)方法且
概念
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'