2016-05-03 4 views
3

Привет У меня проблема с чистым кешем при выполнении метода. Вот мои настройки и кэширует методы:Spring Cache Evict не работает

@Configuration 
@EnableCaching 
@AutoConfigureAfter(value = {MetricsConfiguration.class, DatabaseConfiguration.class}) 
@Profile("!" + Constants.SPRING_PROFILE_FAST) 
public class CacheConfiguration { 

    private final Logger log = LoggerFactory.getLogger(CacheConfiguration.class); 
    public static final String STOCK_DETAILS_BY_TICKER_CACHE = "stockDetailsByTickerCache"; 
    public static final String RSS_NEWS_BY_TYPE_CACHE = "rssNewsByTypeCache"; 

    @Bean 
    public CacheManager cacheManager() { 
     SimpleCacheManager cacheManager = new SimpleCacheManager(); 
     List<Cache> caches = new ArrayList<Cache>(); 
     caches.add(new ConcurrentMapCache(STOCK_DETAILS_BY_TICKER_CACHE)); 
     caches.add(new ConcurrentMapCache(RSS_NEWS_BY_TYPE_CACHE)); 
     cacheManager.setCaches(caches); 
     return cacheManager; 
    } 
} 

Этот метод я хочу кэшировать:

@Cacheable(cacheNames = CacheConfiguration.RSS_NEWS_BY_TYPE_CACHE, key = "#type") 
    public ResponseEntity<List<NewsDetailsDTO>> getLatestNewsMessageByType(RssType type) { 
     Pageable pageable = new PageRequest(0, 5, Sort.Direction.DESC, "createdDate"); 
     List<NewsMessage> latestNewsMessage = newsMessageRepository.findByType(type, pageable).getContent(); 
     return new ResponseEntity<List<NewsDetailsDTO>>(mapToDTO(latestNewsMessage), HttpStatus.OK); 
    } 

Об исполнении этого метода я хотел бы очистить кэш по типу:

@CacheEvict(cacheNames={CacheConfiguration.RSS_NEWS_BY_TYPE_CACHE}, beforeInvocation = true, key = "#news.type") 
    public void save(NewsMessage news) { 
     newsMessageRepository.save(news); 
    } 

И объект NewsMessage выглядит так:

@Entity 
@Table(name = "NEWS_MESSAGE") 
public class NewsMessage extends ChatMessage { 

    <other fileds> 

    @NotNull 
    @Enumerated(EnumType.STRING) 
    private RssType type; 
} 

Работа с кешем работает нормально, в первый раз, когда запрос к БД выполняется вторым, а затем данные извлекаются из кеша. Проблема в том, что когда я обновляю данные, @CacheEvict не очищает кеш. Я пытался очистить весь кеш, используя эту аннотацию: @CacheEvict (cacheNames = {CacheConfiguration.RSS_NEWS_BY_TYPE_CACHE}, allEntries = true) Но это также не работает. Не могли бы вы помочь мне?

ответ

0

Вам нужен общедоступный метод getType() RssType в вашем классе NewsMessage. Ключевое выражение «# news.type» в аннотации @CacheEvict ожидает либо открытого поля с именем «тип», либо публичного метода getter с именем «getType».

+0

Я имел следующий поглотитель: \t общественного RssType GetType() { \t \t тип возвращаемого значения; \t} Поэтому он должен работать нормально. Но обратите внимание, что cacheEvict с allEntires = true также не работает. – Pulkownik

0

Я нашел обходное решение для своей проблемы. Мне пришлось перенести аннотацию сверху на весенние данные jpa interace.

public interface NewsMessageRepository extends JpaRepository<NewsMessage, Long> { 

    @CacheEvict(cacheNames = {CacheConfiguration.RSS_NEWS_BY_TYPE_CACHE}, beforeInvocation = true, key = "#p0.type") 
    NewsMessage save(NewsMessage news); 
} 

Теперь он работает так, как я ожидал, но до сих пор не знаю, почему он не работает на моем сервисе. Может быть, потому что мои сервисы реализуют два интерфейса?

@Service 
public class NewsMessageService implements RssObserver, NewsMessageServiceable { 
} 
2

От кого вы называете метод save()?

В своем собственном ответе похоже, что вы переместили аннотации к другому классу/интерфейсу для вызова прокси-объекта этого класса/интерфейса (btw-аннотации, как правило, не должны использоваться в интерфейсах, поскольку они часто не попадают wit по умолчанию).

Поэтому мой вопрос: знаете ли вы прокси-сервер весны? Вы должны вызвать аннотированные методы из методов вне вашего класса MessageRepository для вызова прокси-объекта.

Общая документация для этого здесь: http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#aop-understanding-aop-proxies

или с примерами здесь http://spring.io/blog/2012/05/23/transactions-caching-and-aop-understanding-proxy-usage-in-spring

+0

Вы правы, я пропустил понимание концепции весеннего прокси. Спасибо за ссылки. – Pulkownik

Смежные вопросы