Spring @Cacheable не работает

У меня есть служба со следующими методами:

public Optional<Test> getTestWithId100() {
    return get(100);
}

@Cacheable(value = "test", key = "'1'")
public Optional<Test> get(long id) {
    log.error("not from cache");
    return testRepository.findOneById(id);
}

Я вызываю метод getTestWithId100 из контроллера, но он получает только новое значение.

@Slf4j
@Configuration
@EnableCaching
@AutoConfigureAfter(value = { MetricsConfiguration.class, DatabaseConfiguration.class })
public class CacheConfiguration {

    @PersistenceContext
    private EntityManager entityManager;

    private final MetricRegistry metricRegistry;

    private net.sf.ehcache.CacheManager cacheManager;

    @Inject
    public CacheConfiguration(MetricRegistry metricRegistry) {
        this.metricRegistry = metricRegistry;
    }

    @PreDestroy
    public void destroy() {
        log.info("Remove Cache Manager metrics");
        SortedSet<String> names = metricRegistry.getNames();
        names.forEach(metricRegistry::remove);
        log.info("Closing Cache Manager");
        cacheManager.shutdown();
    }

    @Bean
    public CacheManager cacheManager(Properties properties) {
        log.debug("Starting Ehcache");
        cacheManager = net.sf.ehcache.CacheManager.create();
        cacheManager.getConfiguration().setMaxBytesLocalHeap(properties.getCache().getEhcache().getMaxBytesLocalHeap());
        log.debug("Registering Ehcache Metrics gauges");
        entityManager.getMetamodel().getEntities().forEach(entity -> {
            String name = entity.getName();
            if (name == null || entity.getJavaType() != null)
                name = entity.getJavaType().getName();
            Assert.notNull(name, "entity cannot exist without a identifier");
            net.sf.ehcache.Cache cache = cacheManager.getCache(name);
            if (cache != null)
                cacheManager.replaceCacheWithDecoratedCache(cache, InstrumentedEhcache.instrument(metricRegistry, cache));
        });
        EhCacheCacheManager ehCacheManager = new EhCacheCacheManager();
        ehCacheManager.setCacheManager(cacheManager);
        return ehCacheManager;
    }

}

часть ehcache.xml:

<cache name="test" eternal="true"/>

Почему это не работает? Пробовал с разными ключами, но безуспешно.


person Feeco    schedule 01.10.2016    source источник
comment
См.: stackoverflow.com/questions/16899604/   -  person rpozarickij    schedule 01.10.2016


Ответы (2)


Аннотации Spring работают путем проксирования/улучшения ваших классов. Единственным ограничением в этой системе является то, что когда вы вызываете метод для одного и того же bean-компонента, тогда этот вызов не перехватывается системой, и, следовательно, никакие модификации на основе аннотаций не применяются.

person Louis Jacomet    schedule 02.10.2016

Я думаю, что вы ошибаетесь в cache config, давайте рассмотрим код ниже (у меня он работает нормально):

@Bean
public CacheManager cacheManager() {
    return new EhCacheCacheManager(ehCacheCacheManager().getObject());
}

@Bean
public EhCacheManagerFactoryBean ehCacheCacheManager() {
    EhCacheManagerFactoryBean cmfb = new EhCacheManagerFactoryBean();
    cmfb.setConfigLocation(new ClassPathResource("ehcache.xml"));
    cmfb.setShared(true);
    return cmfb;
}

И, конечно же, ehcache.xml:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:noNamespaceSchemaLocation="ehcache.xsd"
    updateCheck="true"
    monitoring="autodetect"
    dynamicConfig="true">

    <diskStore path="java.io.tmpdir" />

    <cache name="movieFindCache"
        maxEntriesLocalHeap="10000"
        maxEntriesLocalDisk="1000"
        eternal="false"
        diskSpoolBufferSizeMB="20"
        timeToIdleSeconds="300" timeToLiveSeconds="600"
        memoryStoreEvictionPolicy="LFU"
        transactionalMode="off">
        <persistence strategy="localTempSwap" />
    </cache>

</ehcache>

Этот конфиг должен помочь вам, если он не решит проблему, сообщите мне. ХТН

person Artem    schedule 03.10.2016