CacheManager.java
package com.foxinmy.weixin4j.cache;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import com.foxinmy.weixin4j.exception.WeixinException;
/**
* 缓存管理类
*
* @className CacheManager
* @author jinyu(foxinmy@gmail.com)
* @date 2016年5月27日
* @since JDK 1.7
* @see
*/
public class CacheManager<T extends Cacheable> {
protected final CacheCreator<T> cacheCreator;
protected final CacheStorager<T> cacheStorager;
private final ReentrantLock lock = new ReentrantLock();
public CacheManager(CacheCreator<T> cacheCreator, CacheStorager<T> cacheStorager) {
this.cacheCreator = cacheCreator;
this.cacheStorager = cacheStorager;
}
/**
* 获取缓存对象
*
* @return 缓存对象
* @throws WeixinException
*/
public T getCache() throws WeixinException {
String cacheKey = cacheCreator.key();
T cache = cacheStorager.lookup(cacheKey);
try {
if (cache == null && lock.tryLock(3, TimeUnit.SECONDS)) {
try {
cache = cacheStorager.lookup(cacheKey);
if (cache == null) {
cache = cacheCreator.create();
cacheStorager.caching(cacheKey, cache);
}
} finally {
lock.unlock();
}
}
} catch (InterruptedException e) {
throw new WeixinException("get cache error on lock", e);
}
return cache;
}
/**
* 刷新缓存对象
*
* @return 缓存对象
* @throws WeixinException
*/
public T refreshCache() throws WeixinException {
String cacheKey = cacheCreator.key();
T cache = cacheCreator.create();
cacheStorager.caching(cacheKey, cache);
return cache;
}
/**
* 移除缓存
*
* @return 被移除的缓存对象
*/
public T evictCache() {
String cacheKey = cacheCreator.key();
return cacheStorager.evict(cacheKey);
}
/**
* 清除所有的缓存(<font color="red">请慎重</font>)
*/
public void clearCache() {
cacheStorager.clear();
}
}