springboot容器启动顺序之@Configuration ContextRefreshedEvent事件初始化 ApplicationRunner

笔者最近遇到一个问题 我们根据自己业务需要  需要首次启动springboot项目时 把数据库数据同步至本地缓存(比如ehcache)但有一个要求 在缓存未载入成功  不允许有流量打入

一开始我们使用的是一个类实现ApplicationRunner  但发现  这个启动任务是需要等bean全部完成初始化 springmvc等完成初始化后才开始执行,这个时候 如果刚好遇到同步缓存进行中,就会出现缓存穿透的情况 而我们的应用又是希望完成同步完成之后  从缓存中获取数据  这个时候 笔者改成侦听ContextRefreshedEvent初始化完成事件  其实这个方案也已经能解决,

只是笔者项目里面 已经有一个地方用到了这个 刚好尴尬的地方是 这个地方 是发布dubbo的执行方法  而我其实是希望在发布dubbo接口之前完成初始化工作 因为dubbo接口也很有可能消费者会调用  这个还是会造成缓存穿透  所以我单独写了一个@Configuration 

@Configuration

public class SyncFaceInfoToCacheListener {

 

private static Logger logger = LoggerFactory.getLogger(SyncFaceInfoToCacheListener.class);

 

@Autowired

@Qualifier("sqliteManagerImpl")

private SqlieteManager sqlieteManager;

 

@Autowired

private FaceCompareManager faceCompareManager;

 

 

@Value("${local.sqlite.sqlname}")

private String sqlName;

 

 

@Bean

public SyncFaceInfoToCacheListener onApplicationEvent() {

//TODO这里执行业务逻辑

 

return new SyncFaceInfoToCacheListener();

 

}

这样其实优先级会高于基于bean同步完成后的事件监听:ContextRefreshedEvent

 

 

 

猜你喜欢

转载自www.cnblogs.com/zhangfengshi/p/9565964.html