Spring Boot Caching z EhCache nie działa

Aug 29 2020

Używam EhCache i Spring Boot do buforowania odpowiedzi HTTP z zewnętrznego interfejsu API, ale pamięć podręczna nie działa.

Dodam, Thread.sleep (2000);aby zasymulować opóźnienie, które powinno zostać pominięte podczas korzystania z buforowanej odpowiedzi. Ale tak nie jest, a przy każdym wywołaniu metody wywoływane jest również opóźnienie i zewnętrzny interfejs API.

Oto moja klasa konfiguracji pamięci podręcznej

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

I metoda, która powinna być buforowana

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

Masz pomysł, dlaczego to nie działa?

Dziękuję za rady.

Odpowiedzi

2 SKumar Aug 29 2020 at 18:21

Jeśli klucz nie jest określony w adnotacji Cacheable, wówczas wszystkie parametry metody są traktowane jako klucz, co ma miejsce w tym miejscu.

Odnieść się - https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/annotation/Cacheable.html

key - Wartość domyślna to „”, co oznacza, że ​​wszystkie parametry metody są traktowane jako klucz, chyba że skonfigurowano niestandardowy keyGenerator ().

Ponieważ potrzebujesz tylko jednego klucza w pamięci podręcznej TRANSPORT_LOCATIONS, możesz określić nazwę metody jako klucz

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