筆者最近遇到一個問題 我們根據自己業務需要 需要首次啟動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