RefreshCache.java 2.83 KB
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<ContextRefreshedEvent>{

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

	@Autowired
	private Map<String,ICache> 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<String, ICache> 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("============================缓存刷新完毕==============================");
	}

}