Pul*_*nik 6 java spring caching
嗨,我在执行方法时遇到清理缓存问题。这是我的配置和缓存方法:
@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;
}
}
Run Code Online (Sandbox Code Playgroud)
这个方法我想缓存:
@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);
}
Run Code Online (Sandbox Code Playgroud)
在执行此方法时,我想按类型清理缓存:
@CacheEvict(cacheNames={CacheConfiguration.RSS_NEWS_BY_TYPE_CACHE}, beforeInvocation = true, key = "#news.type")
public void save(NewsMessage news) {
newsMessageRepository.save(news);
}
Run Code Online (Sandbox Code Playgroud)
而 NewsMessage 对象看起来像:
@Entity
@Table(name = "NEWS_MESSAGE")
public class NewsMessage extends ChatMessage {
<other fileds>
@NotNull
@Enumerated(EnumType.STRING)
private RssType type;
}
Run Code Online (Sandbox Code Playgroud)
缓存工作正常,第一次有第二次查询数据库,然后从缓存中获取数据。问题是当我更新数据时,@CacheEvict 不会清理缓存。我试图使用此注释清除所有缓存:@CacheEvict(cacheNames={CacheConfiguration.RSS_NEWS_BY_TYPE_CACHE}, allEntries = true) 但它也不起作用。你可以帮帮我吗?
你从哪里调用save()
方法?
在您自己的答案中,您似乎已将注释移动到另一个类/接口以调用该类/接口的代理对象(顺便说一句,通常不应在接口中使用注释,因为它们通常不会被默认配置捕获) .
因此我的问题是:你知道spring aop代理吗?您必须从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
归档时间: |
|
查看次数: |
8473 次 |
最近记录: |