RefreshCache.java
2.83 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
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("============================缓存刷新完毕==============================");
}
}