Я пытаюсь настроить (J) кэши в сочетании декларативной и императивной конфигурации, так как стандарт JCache не предоставляет средства для ограничения максимального размера, который может занимать кэш.Я хочу сделать это как можно более «независимым от провайдера», поэтому у меня есть возможность сменить провайдера в будущем.В настоящее время у меня есть ограничение на использование Java 7, поэтому я считаю, что кофеин отбрасывается.
Я храню список кэшей и продолжительность (TTL) для их записей в моем application.yaml, который я получаю сзагрузчик недвижимости.Затем я создаю свои кеши с кодом ниже:
@Bean
public List<Cache<Object, Object>> getCaches() {
CacheManager cacheManager = this.getCacheManager();
List<Cache<Object, Object>> caches = new ArrayList();
Map<String, String> cacheconfigs = this.cacheConfigPropertyLoader.getPropertyLoader().getCacheconfigs();
Set<String> keySet = cacheconfigs.keySet();
Iterator i$ = keySet.iterator();
while(i$.hasNext()) {
String name = (String)i$.next();
String durationMinutes = (String)cacheconfigs.get(name);
caches.add((new GenericDefaultCacheConfigurator.GenericDefaultCacheConfig(name, new Duration(TimeUnit.MINUTES, Long.valueOf(durationMinutes)))).getCache(cacheManager));
}
return caches;
}
@Bean
public CacheManager getCacheManager() {
return Caching.getCachingProvider().getCacheManager();
}
private class GenericDefaultCacheConfig {
public GenericDefaultCacheConfig(String cacheName, Duration duration) {
public GenericDefaultCacheConfig(String id, Duration duration, Factory expiryPolicyFactory) {
CACHE_ID = id;
DURATION = duration;
EXPIRY_POLICY = expiryPolicyFactory;
}
private MutableConfiguration<Object, Object> getCacheConfiguration() {
return new MutableConfiguration<Object, Object>()
.setTypes(Object.class, Object.class)
.setStoreByValue(true)
.setExpiryPolicyFactory(EXPIRY_POLICY);
}
public Cache<Object, Object> getCache(CacheManager cacheManager) {
CacheManager cm = cacheManager;
Cache<K, V> cache = cm.getCache(CACHE_ID, Object.class, Object.class);
if (cache == null)
cache = cm.createCache(CACHE_ID, getCacheConfiguration());
return cache;
}
}
Это прекрасно работает для создания моих кешей и использования их с аннотациями и императивным кодом, независимо от того, какой провайдер JCache я использую в POM (я проверял его сorg.jsr107.ri, hazelcast и EhCache).
Теперь мне нужно ограничить максимальный размер всех кэшей с проприетарной конфигурацией.Мне нужна общая / стандартная конфигурация, которая будет применяться к любому кешу, созданному этим провайдером, независимо от его других специфических характеристик (политика истечения срока действия, время жизни и т. Д.), Которые устанавливаются императивной конфигурацией.
У меня возникли проблемы при включении файла конфигурации для менеджера кэша, настроенного с помощью файла конфигурации, который будет использоваться для создания этих кэшей, объявленных в моем файле yaml.Есть идеи / предложения?Я помню, как где-то читал об использовании * в конфигурации Ehcache, но я не смог найти эту страницу снова.