Смешивание декларативных и императивных конфигураций JCache

Я пытаюсь настроить (J) кеши в сочетании декларативной и императивной конфигурации, поскольку стандарт JCache не предоставляет средств для ограничения максимального размера кеша, который может занимать. Я хочу сделать это как можно более независимым от провайдера, чтобы в будущем у меня была возможность сменить провайдера. В настоящее время у меня есть ограничение на использование Java 7, поэтому я считаю, что Caffeine отбрасывается.

Я храню список кешей и продолжительность (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, но не смог снова найти эту страницу.


person JPS    schedule 11.10.2018    source источник


Ответы (2)


Реализация Hazelcast JCache не поддерживает смешивание декларативных и императивных конфигураций.

Но реализация Hazelcast CacheConfiguration, CacheConfig , позволяет передавать CompleteConfiguration в качестве параметра конструктора. CacheConfig копирует атрибуты данного CompleteConfiguration, и впоследствии вы можете установить дополнительные атрибуты.

Не лучший, но таким образом вы можете разделить настройку стандартных свойств кэша и проприетарной конфигурации.

person mdogan    schedule 12.10.2018
comment
Спасибо за ответ! - person JPS; 12.10.2018

Я буду размещать свои выводы здесь, так что они могут быть использованы в качестве ссылки.

Хейзелкаст

Как ответил mdogan, Hazelcast не поддерживает это. Он имеет концепцию конфигураций с подстановочными знаками (проверьте этот ответ), но они не применяются к кэшам, настроенным программно.

Экэш

В Ehcache я нашел способ. Согласно их документации:

Настройте шаблон по умолчанию, от которого наследуются все программно созданные экземпляры Cache.

Вам нужно объявить шаблон по умолчанию, как показано ниже:

<config
    xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
    xmlns='http://www.ehcache.org/v3'
    xmlns:jsr107='http://www.ehcache.org/v3/jsr107'
    xsi:schemaLocation="
        http://www.ehcache.org/v3 http://www.ehcache.org/schema/ehcache-core-3.0.xsd
        http://www.ehcache.org/v3/jsr107 http://www.ehcache.org/schema/ehcache-107-ext-3.0.xsd"> 

  <service> 
    <jsr107:defaults default-template="defCache"> 
    </jsr107:defaults>
  </service>

  <cache-template name="defCache">
    <heap unit="entries">20</heap>
  </cache-template>
</config>

и установите всю конфигурацию, которая вам нравится, в этом кеше. Эта декларативная конфигурация дополняет или даже отменяет программную. Информацию о том, как указать максимальный размер Ehcache, можно найти здесь.

person JPS    schedule 12.10.2018