package com.zteits.park.cache; import java.util.Map; import java.util.Map.Entry; import java.util.concurrent.TimeUnit; import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Conditional; import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.stereotype.Component; import com.clouds.common.cache.base.ICache; import com.zteits.park.constant.ZKConstant; @Conditional(RefreshCacheCondition.class) @Component("com.zteits.park.cache.RefreshCache") public class RefreshCache implements ApplicationListener{ private static final Logger logger = LoggerFactory.getLogger(RefreshCache.class); @Autowired private Map cacheMaps; @Autowired private RedissonClient redissonClient; @Override public void onApplicationEvent(ContextRefreshedEvent event) { logger.info("============================应用启动完成,开始刷新缓存=============================="); // 这里原先是 Zookeeper 的 InterProcessMutex(ZkClientFactory + ${spring.dubbo.registry.address})。 // 去掉 Dubbo/Zookeeper 后改用 Redisson 分布式锁:同样是跨实例互斥、同样最多等 10 秒、 // 同样在拿不到锁时跳过刷新,只是协调者从 ZK 换成 Redis。 // 锁路径沿用 ZKConstant 里的原值,语义上就是同一个「启动刷缓存」锁。 RLock lock = redissonClient.getLock(ZKConstant.REFRESH_CACHE_LOCK_PATH); boolean locked = false; try { if (lock.tryLock(10, TimeUnit.SECONDS)) { locked = true; logger.info("============================获取锁成功,开始刷新缓存=============================="); for (Entry cacheMap : cacheMaps.entrySet()) { logger.info("============================开始刷新缓存:"+cacheMap.getKey()+"=============================="); cacheMap.getValue().writeData(); } }else{ logger.info("============================获取锁失败,不执行刷缓存操作=============================="); } } catch (Exception e) { e.printStackTrace(); } finally { // 只在真正拿到锁时释放:原 ZK 版是无条件 release(),没拿到锁时会抛 // IllegalMonitorStateException 再被 catch 吞掉、只打印一堆堆栈。 if (locked) { try { lock.unlock(); } catch (Exception e) { e.printStackTrace(); } } } logger.info("============================缓存刷新完毕=============================="); } }