我按如下方式配置了缓存:
@Configuration
@EnableCaching
public class CacheConfig {
@Bean(name = "caffeineCachingProvider")
public CachingProvider caffeineCachingProvider() {
return Caching.getCachingProvider("com.github.benmanes.caffeine.jcache.spi.CaffeineCachingProvider");
}
@Bean(name = "caffeineCacheManager")
public JCacheCacheManager getSpringCacheManager() {
CacheManager cacheManager = caffeineCachingProvider().getCacheManager();
CaffeineConfiguration<String, List<Product>> caffeineConfiguration = new CaffeineConfiguration<>();
caffeineConfiguration.setExpiryPolicyFactory(FactoryBuilder.factoryOf(new AccessedExpiryPolicy(new Duration(TimeUnit.MINUTES, 60))));
caffeineConfiguration.setCopierFactory(Copier::identity);
cacheManager.createCache("informerCache", caffeineConfiguration);
return new JCacheCacheManager(cacheManager);
}
}
我也有@Service
以下列方式使用它:
@Service
public class InformerService {
@CacheResult(cacheName = "informerCache")
public List<Product> getProducts(@CacheKey String category, @CacheKey String countrySign, @CacheKey long townId) throws Exception {
Thread.sleep(5000);
// do some work
}
}
所以我有下一个行为。
Thread.sleep
一遍又一遍。
如何解决这个问题?这是关于代理的问题吗?我错过了什么?
答案 0 :(得分:3)
正如评论中所讨论的,这是JCache适配器中的一个错误。感谢您告诉我这个问题。我发布了包含此修复程序的版本2.1.0。该版本还包括您在另一个post中确定的CaffeineConfiguration
更友好的初始设置。
虽然核心库经过严格测试,但JCache适配器过于依赖JSR的TCK(测试兼容性工具包)。不幸的是,测试套件并不是非常有效,因此我添加了测试以帮助避免将来出现这些类型的错误。
此问题仅发生在JCache中,因为Caffeine的核心库不支持其过期版本。咖啡因更喜欢使用O(1)设计,通过使用固定的持续时间来急切地清理过期的条目。 JCache使用每个条目的延迟到期,并且规范作者假设容量约束用于最终丢弃过期的条目。我在有关此功能的文档中添加了warning,因为它可能容易出错。虽然其他JCache实现都没有超出此范围,但一项待定任务是决定一种机制来帮助缓解这种JCache设计缺陷。
再次感谢您报告此问题。与往常一样,如果您有任何其他问题或反馈意见,请随时与我们联系。