今天,我被要求为应用程序正在使用的某些键设置缓存的过期时间,因此我Swift开始寻找Spring @Cacheable表示法提供的所有选项,以设置过期时间或生存时间。 由于Spring没有提供任何可配置的选项来实现它,因此,我利用固定延迟的@Scheduled注释构建了一个实现,如下所示:
@CacheEvict(allEntries = true, cacheNames = { "EMPLOYEE_", "MANAGER_" })
@Scheduled(fixedDelay = 30000)
public void cacheEvict() {
}
现在的问题是我希望从环境值而不是硬编码值填充缓存名称以及固定的延迟时间。 为了实现相同的目的,我在类级别声明了变量(从属性文件填充),并在注释中填充了键的值,这使IDE抱怨值必须是常量,如下所示:
“注释属性CacheEvict.cacheNames的值必须是一个常量表达式”
然后,我开始寻找其他选项来从环境中获取键的值,并遇到了@Scheduled表示法的fixedDelayString元素,它帮助我实现了目标,如下所示:
@Scheduled(fixedDelayString = "${couchbase.cache.flush.fixed.delay}")
public void cacheEvict() {
}
在寻找@CacheEvict注释的类似元素时,不幸的是,在阅读关于SPR-10778的bug的注释后给了我一个提示,该元素不可用,提示说:
“缓存抽象现在支持CacheResolver抽象,并且可以按类和/或在特定操作上全局指定。 CacheResolver使您能够计算要在代码中使用的缓存,从而拥有所需的所有灵活性。”
正如错误所言,要利用CacheResolver动态填充缓存名称,我使用了AbstractCacheResolver的实现从环境中获取缓存的名称,如下所示:
@Value("#{'${couchbase.cache.flush}'}")
private String couchbaseCacheFlush;@Bean(name = "customCacheResolver")public CacheResolver cacheResolver() {CacheResolver cacheResolver = new AbstractCacheResolver(cacheManager()) {@Overrideprotected Collection<String> getCacheNames(CacheOperationInvocationContext<?> context) {return Arrays.asList(couchbaseCacheFlush.split(","));}};return cacheResolver;}
修改cacheEvict()以使用自定义缓存解析器而不是缓存名称完成了当天的任务,如下所示:
@CacheEvict(allEntries = true, cacheResolver = "customCacheResolver")
@Scheduled(fixedDelayString = "${couchbase.cache.flush.fixed.delay}")
public void cacheEvict() {
}
完整的源代码可以在github上找到 。
翻译自: https://www.javacodegeeks.com/2017/01/setting-ttl-cacheable-spring.html