Spring Boot Caching con EhCache no funciona

Aug 29 2020

Estoy usando EhCache y Spring Boot para almacenar en caché la respuesta HTTP de la API externa, pero el caché no parece funcionar.

Estoy agregando Thread.sleep (2000);para simular el retraso que debe omitirse cuando se usa una respuesta en caché. Pero no lo es, y con cada llamada de método, también se llama un retraso y una API externa.

Aquí está mi clase de configuración de caché

@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());
    }
}

Y método, que debe almacenarse en caché

    @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());
    }

¿Tienes alguna idea de por qué esto no funciona?

Gracias por tus consejos.

Respuestas

2 SKumar Aug 29 2020 at 18:21

Cuando la clave no se especifica en la anotación Cacheable, todos los parámetros del método se consideran como una clave que está sucediendo aquí.

Referirse -https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html

clave: el valor predeterminado es "", lo que significa que todos los parámetros del método se consideran una clave, a menos que se haya configurado un keyGenerator() personalizado.

Dado que solo necesita una clave única en el caché TRANSPORT_LOCATIONS, puede especificar el nombre del método como la clave

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