public interface ICacheManager {
Cache getOrCreateCache(String paramString);
Cache getOrCreateCache(String paramString, CacheLoader> paramCacheLoader);
}
import com.example.manager.ICacheManager;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import com.google.common.cache.CacheLoader;
import com.google.common.cache.LoadingCache;
@Component
public class CacheManager implements ICacheManager {
private static final Logger log = LoggerFactory.getLogger(CacheManager.class);
private Map cacheMap = new HashMap<>();
@Value("#{${cache.maximumSize.map:null}}")
private Map cacheMaximumSizeMap;
@Value("${cache.default.maximumSize}")
private Long defaultCacheMaximumSize;
@Value("#{${cache.expireAfterAccess.map:null}}")
private Map cacheExpireAfterAccessMap;
@Value("${cache.default.expireAfterAccess}")
private Long defaultCacheExpireAfterAccess;
@Autowired
private Environment env;
public Cache getOrCreateCache(String cacheName) {
Cache cache = this.cacheMap.get(cacheName);
if (cache != null)
return cache;
synchronized (CacheManager.class) {
if (!this.cacheMap.containsKey(cacheName)) {
Long maximumSize = getCacheProperty(cacheName, this.cacheMaximumSizeMap, this.defaultCacheMaximumSize);
Long expireAfterAccess = getCacheProperty(cacheName, this.cacheExpireAfterAccessMap, this.defaultCacheExpireAfterAccess);
cache = CacheBuilder.newBuilder().maximumSize(maximumSize.longValue()).expireAfterAccess(expireAfterAccess.longValue(), TimeUnit.MILLISECONDS).build();
this.cacheMap.put(cacheName, cache);
log.info("create cache, cacheName: {}, maximumSize: {}, expireAfterAccess: {}ms", new Object[] { cacheName, maximumSize, expireAfterAccess });
}
}
return this.cacheMap.get(cacheName);
}
public Cache getOrCreateCache(String cacheName, CacheLoader> cacheLoader) {
Cache cache = this.cacheMap.get(cacheName);
if (cache != null)
return cache;
synchronized (CacheManager.class) {
if (!this.cacheMap.containsKey(cacheName)) {
Long maximumSize = getCacheProperty(cacheName, this.cacheMaximumSizeMap, this.defaultCacheMaximumSize);
Long expireAfterAccess = getCacheProperty(cacheName, this.cacheExpireAfterAccessMap, this.defaultCacheExpireAfterAccess);
LoadingCache loadingCache = CacheBuilder.newBuilder().maximumSize(maximumSize.longValue()).refreshAfterWrite(expireAfterAccess.longValue(), TimeUnit.MILLISECONDS).build(cacheLoader);
this.cacheMap.put(cacheName, loadingCache);
log.info("create cache, cacheName: {}, maximumSize: {}, expireAfterAccess: {}ms", new Object[] { cacheName, maximumSize, expireAfterAccess });
}
}
return this.cacheMap.get(cacheName);
}
private T getCacheProperty(String cacheName, Map configMap, T defaultValue) {
if (configMap == null || !configMap.containsKey(cacheName))
return defaultValue;
return configMap.get(cacheName);
}
public int getCacheMapSize() {
if (this.cacheMap != null)
return this.cacheMap.size();
return 0;
}
}
@Component
public class MetabaseInfoCache implements Serializable {
private static final Logger log = LoggerFactory.getLogger(MetabaseInfoCache.class);
@Value("${queryResourceFromMetabase:false}")
private Boolean queryResourceFromMetabase;
@Value("${queryApiWeaknessEnable:false}")
private Boolean queryApiWeaknessEnable;
@DynamicValue(dataId = "handler.metabase.mapping.json", groupId = "handler", typeClz = MetabaseMappingConfig.class)
private MetabaseMappingConfig metabaseMappingConfig;
private static Cache>> apiCache;
private static Cache>> appCache;
@Autowired
private MetabaseClientProxy metabaseClientProxy;
@Autowired
private MongoClientProxy mongoClientProxy;
@Autowired
MongoTemplate mongoTemplate;
public static final String LABEL_CONFIGS_KEY = "labelConfigs";
public static final String WEAKNESS_ID_KEY = "weaknessId";
public static final String ENUMERATE_PARA_LABEL_CONFIGS_KEY = "enumerateParaLabelConfigs";
public static final String RECOMMEND_FLG_KEY = "recommendFlag";
public static final String CLASSIFICATIONS_KEY = "classifications";
public static final String FEATURE_LABELS_KEY = "featureLabels";
public static final Map EMPTY_MAP = new HashMap<>();
public MetabaseInfoCache(@Autowired ICacheManager cacheManager) {
apiCache = cacheManager.getOrCreateCache("apiCache", new CacheLoader>() {
public Map load(String key) throws Exception {
return MetabaseInfoCache.this.loadApiInfo(key);
}
});
appCache = cacheManager.getOrCreateCache("appCache", new CacheLoader>() {
public Map load(String key) throws Exception {
return MetabaseInfoCache.this.loadAppInfo(key);
}
});
}
public Map getApiInfos(String uri) {
try {
return ((Optional