springboot优雅的关闭应用
2017-08-17 00:00
495 查看
使用actuator,通过发送http请求关闭
将应用注册为linux服务,通过service xxx stop关闭
具体这两种方式如何实现,这里就不说了,网上百度一堆,主要讲一下在这两种情况下web应用listener的一些问题
一般来讲,我们的应用都应该在结束的时候对资源进行回收处理,jvm帮我们做了一部分,springboot也做了相应bean的回收,那如果是我们自己创建的线程池或是其他未托管于spring的资源呢?
在非web的应用中,我们一般使用勾子来实现,从而保证在jvm退出时,能够进行一些资源的回收(直接kill无法保证执行),kill命令相当于直接把应用干掉,是一种非正常情况下中止应用的方式。ctrl+c,System.exit(),程序正常退出都会触发勾子
在web应用中,勾子就不一定能够生效了,而是通过实现ServletContextListener接口,可以在context初始化和结束的时候做一些资源创建和回收的操作
问题来了,在使用第二种方式将springboot应用注册为linux服务时,发现通过service xxx stop命令停止应用时,contextDestroyed的日志根本没打印出来,怀疑是LOGGER对象已经被jvm回收,于是改成System.out,这次begin打印出来了,但是并没有调用 ShutdownUtil.destroy()方法,怀疑同上,具体的机制没去详细了解,猜测是springboot自己的回收策略,或者是该插件的坑。
使用actuator的方式没有问题,会正常的执行destroyed的回收
将应用注册为linux服务,通过service xxx stop关闭
具体这两种方式如何实现,这里就不说了,网上百度一堆,主要讲一下在这两种情况下web应用listener的一些问题
一般来讲,我们的应用都应该在结束的时候对资源进行回收处理,jvm帮我们做了一部分,springboot也做了相应bean的回收,那如果是我们自己创建的线程池或是其他未托管于spring的资源呢?
在非web的应用中,我们一般使用勾子来实现,从而保证在jvm退出时,能够进行一些资源的回收(直接kill无法保证执行),kill命令相当于直接把应用干掉,是一种非正常情况下中止应用的方式。ctrl+c,System.exit(),程序正常退出都会触发勾子
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { @Override public void run() { try { shutdown(componentName); } catch (Exception e) { LOGGER.error("shutdown error:", e); } } }, componentName + "_shutdown_hook_thread"));
在web应用中,勾子就不一定能够生效了,而是通过实现ServletContextListener接口,可以在context初始化和结束的时候做一些资源创建和回收的操作
public class ContextListener implements ServletContextListener { private static final Logger LOGGER = LoggerFactory.getLogger(ContextListener.class); @Override public void contextInitialized(ServletContextEvent servletContextEvent) { LOGGER.info("contextInitialized"); } @Override public void contextDestroyed(ServletContextEvent servletContextEvent) { LOGGER.info("contextDestroyed begin..."); ShutdownUtil.destroy(); LOGGER.info("contextDestroyed end..."); } }
问题来了,在使用第二种方式将springboot应用注册为linux服务时,发现通过service xxx stop命令停止应用时,contextDestroyed的日志根本没打印出来,怀疑是LOGGER对象已经被jvm回收,于是改成System.out,这次begin打印出来了,但是并没有调用 ShutdownUtil.destroy()方法,怀疑同上,具体的机制没去详细了解,猜测是springboot自己的回收策略,或者是该插件的坑。
使用actuator的方式没有问题,会正常的执行destroyed的回收
相关文章推荐
- Spring Boot的应用正常启动与关闭
- Spring Boot的应用启动与关闭的方法
- SpringBoot-Actuator应用监控以及优雅停机
- Spring Boot的应用启动与关闭
- SpringBoot应用正常关闭
- 如何优雅的打包 Spring Boot 应用
- Spring在非web应用中优雅地关闭Spring IoC容器
- 【springboot】之利用shell脚本优雅启动,关闭springboot服务
- Spring Boot的应用启动与关闭的方法
- Spring Boot利用@Async异步调用:ThreadPoolTaskScheduler线程池的优雅关闭详解
- spring boot应用启动及关闭方式
- Spring在非web应用中优雅地关闭Spring IoC容器
- spring-boot使用Admin监控应用的方法
- SpringBoot应用Docker化
- 企业分布式微服务云SpringCloud SpringBoot mybatis (二十九)springboot集成swagger2,构建优雅的Restfu API
- JWT在SpringBoot中的应用
- spring boot应用启动原理分析
- Spring Boot中Web应用的统一异常处理
- spring-cloud-starter-feign 组件在spring boot中的应用:访问Oauth2资源服务器的资源接口
- 使用Docker部署Spring Boot的应用示例