Spring Boot Caching con EhCache no funciona
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
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")