Почему @Cacheable не работает после второго вызова метода - PullRequest
0 голосов
/ 20 сентября 2018

Выясните, что кеширование не работает для меня, потому что методы с аннотациями @Cacheable находятся внутри классов с такой структурой.У меня есть

public interface Filter<T> {
    List<T> filter(int limit);
} 

и куча реализаций:

@Component
public class UpcomingFilter implements Filter<Entity> {

    @Cacheable(value = {"upcoming"})
    @Override
    public List<Entity> filter(int limit) {
       //retrieve from repository
    }
}

@Component
public class RecentlyAddedFilter implements Filter<Entity> {
@Cacheable(value = {"recentlyAdded"})
    @Override
    public List<Entity> filter(int limit) {
       //retrieve from repository
    }
}
//and 6 more implementations

Для оптимизации автопроводки этих фильтров я использую HashMap, где я храню эти фильтры:

@EnableAspectJAutoProxy
@ComponentScan
@Configuration
public class AppConfig {

    @Bean("filtersMap")
    public Map<String, Filter> filters() {
        Map<String, Filter> filtersMap = new HashMap<>();

        filtersMap.put("upcomingFilter", new UpcomingFilter(sessionRepository));
        filtersMap.put("recentlyAddedFilter", new RecentlyAddedFilter(entityRepository));
        //..another filters
        return filtersMap;
    }

    }

И эту карту я автоматически подключаю в своем слое обслуживания:

@Qualifier("filtersMap") Map<String, Filter> filterMap

Конфигурация кэша:

@EnableCaching
@Configuration
public class CacheConfiguration {
    @Bean
    public CacheManager cacheManager() {
        String[] cacheNames = new String[] {"upcoming", "recentlyAdded"};
        return new ConcurrentMapCacheManager(cacheNames);
    }

}

И я выполняю sysout в каждом методе фильтрации и измеряю время выполнения.Это показывает, что кешируемые методы вызываются каждый раз, а кеш не используется.Затем я создаю простой класс MyFilter без реализации интерфейса Filter , аннотирую его метод с помощью @ Cacheable , и он работает как чудо.Итак, как решить эту проблему, что кеш не работает для классов, которые реализуют Filter interface

1 Ответ

0 голосов
/ 21 сентября 2018

Нашел решение по этой ссылке Метод с аннотацией @Cacheable не перехватывается и комментарием Николаса:

добавить компонент службы, который имеет аннотацию @Cacheable, в класс конфигурации кэша:

@EnableCaching
@Configuration
public class CacheConfiguration {

    @Bean
    public CacheManager cacheManager() {
        String[] cacheNames = new String[] {"upcoming", "recentlyAdded"};
        return new ConcurrentMapCacheManager(cacheNames);
    }

    @Bean
    public PopularFilter popularFilter() {
        return new PopularFilter(myRepository);
    }

     @Bean("filtersMap")
public Map<String, Filter> filters() {
    Map<String, Filter> filtersMap = new HashMap<>();
    filtersMap.put("popularFilter", popularFilter());
    //...
    return filtersMap;
}
...