eh-кеш с Grails 3

Ehcache не работает должным образом в моем проекте. Я запускаю Grails 3.3.1 "с org.grails.plugins:cache-ehcache:3.0.0.M1", и поскольку я не знаю, куда поместить файл ehcache.xml и как он должен выглядеть, я попытался настроить ehcache программно.

Я создал cacheService с помощью метода «initCaches», который я запускаю из своего bootstrap.groovy.

class CacheService {
void initCaches() {       
    CacheManager cacheManager = CacheManagerBuilder.newCacheManagerBuilder()
        .withCache("sevenSeconds", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))
            .withExpiry(Expirations.timeToLiveExpiration(Duration.of(7, TimeUnit.SECONDS)))
        )
        .withCache("twentySeconds", CacheConfigurationBuilder.newCacheConfigurationBuilder(Long.class, String.class, ResourcePoolsBuilder.heap(10))
            .withExpiry(Expirations.timeToLiveExpiration(Duration.of(20, TimeUnit.SECONDS)))
        )
        .build()  
    cacheManager.init()
}
}

Когда я запускаю приложение, консоль говорит, что кеши созданы:

2018-06-26 15:47:31.302  INFO --- [           main] org.ehcache.core.EhcacheManager          : Cache 'sevenSeconds' created in EhcacheManager.
2018-06-26 15:47:31.310  INFO --- [           main] org.ehcache.core.EhcacheManager          : Cache 'twentySeconds' created in EhcacheManager.

Теперь я обращаюсь к сервисному методу, который аннотирован @Cacheable("sevenSeconds"), и начинается часть, которая меня смущает: снова консоль говорит, что кеш создан (вместо того, чтобы поместить результат в старый уже из CacheService создал один):

2018-06-26 15:47:31.302  INFO --- [           main] org.ehcache.core.EhcacheManager          : Cache 'sevenSeconds' created in EhcacheManager.

Если я снова получу доступ к сервису с теми же параметрами, будет возвращен кешированный результат, НО timeToLive НЕ 7 секунд, как я создал кеш в своем CacheService.

Похоже, @Cacheable не учитывает мои созданные кеши в CacheService

Кто-нибудь знает, что я делаю неправильно?

спасибо


person pebbles    schedule 26.06.2018    source источник


Ответы (1)


Я не знаю, как Grails управляет CacheService и как вызывается initCaches. Однако ваш CacheManager является локальной переменной. Поэтому я ожидаю, что это будет сборка мусора в конце initCaches.

@Cacheable, вероятно, использует какой-то другой CacheManager. Вот что вы должны исправить, сделав CacheManager, созданный в initCaches, доступным для ожидаемого соглашения Grails.

person Henri    schedule 30.06.2018
comment
так что объем различен между созданием кеша через ehcache.xml и программным способом? - person pebbles; 02.07.2018
comment
Объем? Я говорю о переменной cacheManager. Его область действия является локальной для метода. - person Henri; 02.07.2018
comment
ну, я не нашел способа сделать программно созданный cacheManager глобальным. поэтому я настроил cacheManager через файл xml - person pebbles; 09.07.2018