Spring, ehCache, несколько менеджеров кеша выдают ошибки, когда обнаруживаются уже существующие кеши с одинаковым именем - PullRequest
0 голосов
/ 17 сентября 2018

Добрый вечер всем .. может, кто-нибудь поможет мне разобраться с этим.

Я пытаюсь настроить несколько менеджеров кэша, каждый со своим собственным набором отдельных кэшей. Для этого у меня есть следующее:

MyCachingFactory:

public interface MyCachingFactory {
    public JCacheCacheManager cacheManager();
    public JCacheCacheManager commonCacheManager();
    public JCacheCacheManager secondaryCacheManager();
    public JCacheCacheManager secondaryCacheManager();
}

MyCachingFactoryImpl:

@EnableCaching
public class MyCachingFactoryImpl implements MyCachingFactory {
    private static final int DEFAULT_CACHE_EXPIRY = 64800;

    private static final List<String> DEFAULT_CACHES = Arrays.asList(
        "default");

    private static final List<String> COMMON_CACHES = Arrays.asList(
        "common_default", 
        "common_config", 
        "common_session",
        "common_roles", 
        "common_capabilities");

    private static final List<String> SECONDARY_CACHES = Arrays.asList(
        "secondary_default",
        "secondary_foo");

    private static final List<String> TERTIARY_CACHES = Arrays.asList(
        "tertiary_default",
        "tertiary_foo");

    @Bean  
    public JCacheCacheManager cacheManager() {
        return getNewJCacheManager(DEFAULT_CACHES);
    }

    @Bean
    public JCacheCacheManager commonCacheManager() {
        return getNewJCacheManager(COMMON_CACHES);
    }

    @Bean
    public JCacheCacheManager secondaryCacheManager() {
        return getNewJCacheManager(SECONDARY_CACHES);
    }

    @Bean
    public JCacheCacheManager tertiaryCacheManager() {
        return getNewJCacheManager(TERTIARY_CACHES);
    }

    private JCacheCacheManager getNewJCacheManager(List<String> cacheNames) {
        JCacheCacheManager springJCacheManager = new JCacheCacheManager();
        CachingProvider provider = Caching.getCachingProvider();
        EhcacheCachingProvider ehcacheProvider = (EhcacheCachingProvider) provder;
        javax.cache.CacheManager jCacheManager = ehcacheProvider.getCacheManager();

        AtomicInteger count = new AtomicInteger(1);
        cacheNames.forEach((listName) -> {
            logger.debug("[" + count + "] Creating cache name [" + listName + "].");
            jCacheManager.createCache(listName, new MutableConfiguration<>()
                .setExpiryPolicyFactory(TouchedPolicyExpiry.factoryOf(new Duration(TimeUnit.SECONDS, DEFAULT_CACHE_EXPIRY)))
                .setStoryByValue(false)
                .setStatisticsEnabled(true));

            count.incrementAndGet();
        });

        springJCacheManager.setCacheManager(jCacheManager);    

        return springJCacheManager;
    }
}         

Пример класса:

public class Example { 
    @Resource
    private JCacheCacheManager commonCacheManager;

    @CacheResult(cacheName = "common_config")
    public String getCachedConfigByName(String name) { ... }

    @CacheResult(cacheName = "common_config") 
    public String getCachedConfigByType(String type) { ... }
}

Однако при запуске приложения я вижу свои операторы отладки для создания кэша ... повторяющийся по списку один и тот же (в данном случае COMMON_CACHE) несколько раз. Это, в свою очередь, вызывает вложенное исключение в том, что Spring жалуется, что кэш с именем X уже существует.

Что я здесь не так делаю?

Заранее спасибо (иди, пожалуйста ... Я новичок в весеннем кэшировании).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...