Spring Boot Caching mit EhCache funktioniert nicht
Ich verwende EhCache und Spring Boot, um die HTTP-Antwort von der externen API zwischenzuspeichern, aber der Cache scheint nicht zu funktionieren.
Ich füge hinzu Thread.sleep (2000);, um die Verzögerung zu simulieren, die übersprungen werden sollte, wenn eine zwischengespeicherte Antwort verwendet wird. Dies ist jedoch nicht der Fall, und bei jedem Methodenaufruf werden auch eine Verzögerung und eine externe API aufgerufen.
Hier ist meine Cache-Konfigurationsklasse
@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());
}
}
Und Methode, die zwischengespeichert werden sollte
@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());
}
Haben Sie eine Idee, warum dies nicht funktioniert?
Vielen Dank für Ihre Ratschläge.
Antworten
Wenn der Schlüssel in der Annotation Cache nicht angegeben ist, werden alle Methodenparameter als Schlüssel betrachtet, der hier ausgeführt wird.
Verweisen - https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html
key - Standard ist "", was bedeutet, dass alle Methodenparameter als Schlüssel betrachtet werden, es sei denn, ein benutzerdefinierter keyGenerator () wurde konfiguriert.
Da Sie im TRANSPORT_LOCATIONS-Cache nur einen einzigen Schlüssel benötigen, können Sie den Methodennamen als Schlüssel angeben
@Cacheable(value = TRANSPORT_LOCATIONS, cacheManager = "cacheManager", key = "#root.methodName")