赞
踩
场景: 之前项目实现SmartLifecycle接口.默认需要重写start()和stop(),这接口优秀在只要被spring接管的bean,实现并重写这两个方法就能在服务启动或者停止时执行.
public class SomeServiceImpl implements SmartLifecycle {
@Override
public void start() {
log.info("服务启动后,初始化...");
isRunning = true;
}
@Override
public void stop() {
log.info("服务停止前,方法调用...");
}
}
由于项目需要升级spring版本,升级后发现之前实现了SmartLifecycle的接口要求多实现几个方法,直接工具生成后,也没看几个方法是干嘛的,反正代码不报错就ok了.
当时并没有意识到问题-_-…
后来项目运行阶段通过查询日志,耽误了不少时间才发现,start()方法并没有按预期运行.
当时确实没有想过是start()不运行.因此专门去了解了下SmartLifecycle用法.才发现问题所在
直接贴代码了.注释有说明
public class SomeServiceImpl implements SmartLifecycle { /** * 服务启动后执行.无需显示调用start方法. * 但是依赖isAutoStartup()返回值,只有isAutoStartup()返回true的时候,start()才会被执行 */ @Override public void start() { log.info("服务启动后,初始化..."); isRunning = true; } /** * 服务停止前执行方法 * 前提条件: isRunning()返回true才会被执行 */ @Override public void stop() { log.info("服务停止前,方法调用..."); } /** * 返回服务运行状态,影响到服务是否调用stop方法 * @return */ @Override public boolean isRunning() { return true; } /** * 是否调用start方法,需要注意 * 当前方法返回false是不会执行start() * @return */ @Override public boolean isAutoStartup() { return true; } /** * 指定执行顺序 * 当前容器如果有多个类实现了SmartLifecycle,则按此法方法返回值排序执行 * @return */ @Override public int getPhase() { return 0; } }
start()
服务启动后运行,运行的前置条件: isAutoStartup()返回true的时候才会执行
stop()
服务停止前运行,运行的前置条件: isRunning()返回true的时候才会执行
isRunning()
:
标记服务是否运行成功
isAutoStartup()
是否执行start()
getPhase()
当前容器如果有多个类实现了SmartLifecycle,则按此法方法返回值排序执行
这下终于搞明白自己的start()为啥不运行了…
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。