• 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

     

     

     

  • 相关阅读:
    关于DOM事件操作
    js 去掉字符串前后空格
    oracle创建表索引
    导入Excel -- 套路及代码分析
    漫谈五种IO模型(主讲IO多路复用)
    Reactor模式
    jvm
    Python入门学习资料推荐
    ConcurrentHashMap & Hashtable
    分布式系统的接口幂等性设计
  • 原文地址:https://www.cnblogs.com/zhangfengshi/p/9565964.html
Copyright © 2020-2023  润新知