Spring Boot Caching с EhCache не работает

Aug 29 2020

Я использую EhCache и Spring Boot для кеширования HTTP-ответа от внешнего API, но, похоже, кеш не работает.

Я добавляю, Thread.sleep (2000);чтобы имитировать задержку, которую следует пропустить при использовании кешированного ответа. Но это не так, и при каждом вызове метода также вызываются задержка и внешний API.

Вот мой класс конфигурации кеша

@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {

    private static final String TRANSPORT_LOCATIONS = "transportLocations";
    private static final int TTL_MILLISECONDS = 15;

    @Bean
    public net.sf.ehcache.CacheManager ehCacheManager() {
        CacheConfiguration transportLocationCache = new CacheConfiguration();
        transportLocationCache.setName(TRANSPORT_LOCATIONS);
        transportLocationCache.setMaxEntriesLocalHeap(1000);
        transportLocationCache.setMemoryStoreEvictionPolicy("LRU");
        transportLocationCache.setTimeToLiveSeconds(TTL_MILLISECONDS);

        net.sf.ehcache.config.Configuration config = new net.sf.ehcache.config.Configuration();
        config.addCache(transportLocationCache);
        return net.sf.ehcache.CacheManager.newInstance(config);
    }

    @Bean
    @Override
    public CacheManager cacheManager() {
        return new EhCacheCacheManager(ehCacheManager());
    }
}

И метод, который нужно кешировать

    @Cacheable(value = TRANSPORT_LOCATIONS, cacheManager = "cacheManager")
    public HttpResponse<String> sendTransportLocationsPostRequest(
            final LinkedHashMap<String, Object> bodyStructure,
            final String url)
            throws Exception {
        Thread.sleep(2000);
        final String body = buildBody(bodyStructure);
        final HttpRequest request = buildPostRequest(url, body);

        return client.send(request, HttpResponse.BodyHandlers.ofString());
    }

Ты хоть представляешь, почему это не работает?

Спасибо за советы.

Ответы

2 SKumar Aug 29 2020 at 18:21

Если ключ не указан в аннотации Cacheable, то все параметры метода рассматриваются как ключ, который здесь происходит.

Ссылаться - https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html

key - По умолчанию "" означает, что все параметры метода считаются ключевыми, если только не был настроен пользовательский keyGenerator ().

Поскольку вам нужен только один ключ в кеше TRANSPORT_LOCATIONS, вы можете указать имя метода в качестве ключа

@Cacheable(value = TRANSPORT_LOCATIONS, cacheManager = "cacheManager", key = "#root.methodName")