序
本文主要研究一下jetcache的BroadcastManager
BroadcastManager
jetcache-core/src/main/java/com/alicp/jetcache/support/BroadcastManager.java
public abstract class BroadcastManager implements AutoCloseable {
private static Logger logger = LoggerFactory.getLogger(BroadcastManager.class);
private final String sourceId = UUID.randomUUID().toString();
private final CacheManager cacheManager;
public BroadcastManager(CacheManager cacheManager) {
this.cacheManager = cacheManager;
}
protected void checkConfig(ExternalCacheConfig config) {
if (config.getBroadcastChannel() == null) {
throw new CacheConfigException("BroadcastChannel not set");
}
if (config.getValueEncoder() == null) {
throw new CacheConfigException("no value encoder");
}
if (config.getValueDecoder() == null) {
throw new CacheConfigException("no value decoder");
}
}
public abstract CacheResult publish(CacheMessage cacheMessage);
public abstract void startSubscribe();
@Override
public void close() throws Exception {
}
//......
}
BroadcastManager是个抽象类,实现了AutoCloseable接口,其close方法默认为空实现,它定义了publish及startSubscribe两个抽象方法;它主要有MockRemoteCacheBuilder的匿名实现、RedisBroadcastManager、LettuceBroadcastManager、SpringDataBroadcastManager、RedissonBroadcastManager这几个实现
MockRemoteCacheBuilder
jetcache-core/src/main/java/com/alicp/jetcache/external/MockRemoteCacheBuilder.java
public BroadcastManager createBroadcastManager(CacheManager cacheManager) {
return new BroadcastManager(cacheManager) {
@Override
public CacheResult publish(CacheMessage cacheMessage) {
lastPublishMessage = cacheMessage;
return CacheResult.SUCCESS_WITHOUT_MSG;
}
@Override
public void startSubscribe() {
subscribeStart = true;
}
};
}
MockRemoteCacheBuilder的createBroadcastManager创建了一个匿名的BroadcastManager,其publish返回CacheResult.SUCCESS_WITHOUT_MSG,其startSubscribe设置subscribeStart为true
RedisBroadcastManager
jetcache-support/jetcache-redis/src/main/java/com/alicp/jetcache/redis/RedisBroadcastManager.java
public class RedisBroadcastManager extends BroadcastManager {
private static final Logger logger = LoggerFactory.getLogger(RedisBroadcastManager.class);
private final byte[] channel;
private final String channelStr;
private final RedisCacheConfig<Object, Object> config;
private volatile CacheMessagePubSub cacheMessagePubSub;
private volatile boolean closed;
private volatile boolean subscribe;
private boolean subscribeThreadStart;
public RedisBroadcastManager(CacheManager cacheManager, RedisCacheConfig<Object, Object> config) {
super(cacheManager);
this.channelStr = config.getBroadcastChannel();
this.channel = channelStr.getBytes(StandardCharsets.UTF_8);
this.config = config;
checkConfig(config);
if (config.get
JetCache广播管理器概览

最低0.47元/天 解锁文章

被折叠的 条评论
为什么被折叠?



