是否可以配置Spring @Cacheable,以便在缓存未命中时对可缓存方法的调用被阻塞,直到可缓存方法执行一次并填充缓存为止?
在我的情况下,我正在处理来自数据库的数据,如果此数据发生更改,则实际上不会经常更改,然后需要重新启动应用程序.我可以创建@PostConstruct方法并在每个服务启动时初始化数据,但这看起来并不像@Cacheable注释那样“优雅”.
我计划将EhCache与Spring @Cacheable注释一起使用.
更新:
以下是我在尝试使用@PostConstruct时遇到的一些问题,以防其他人遇到这些问题. @PostConstruct方法不能是@Transactional,因为它们在设置了对象的属性后运行,而不是在配置完整的spring上下文之后运行.因此,您无法假设在调用@PostConstruct方法时,TX管理器全部设置和配置.解决方法是实现ApplicationListener并手动注入TransactionTemplate …等许多额外的工作,通过使用@Cacheable简化.
解决方法:
我不认为@PostConstruct不优雅,对我来说似乎是完美的解决方案.您希望仅在重新启动应用程序时调用方法.还有什么比这更好的?
但是,您也可以执行此操作来阻止调用,直到缓存可用
@Cacheable(cacheName="yourCache", decoratedCacheType= DecoratedCacheType.SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
//call database
}
并使缓存autorefresh这:
@Cacheable(cacheName="yourCache", refreshInterval=1000, decoratedCacheType= DecoratedCacheType.REFRESHING_SELF_POPULATING_CACHE)
public List<String> getWhatever(int id) {
//call database
}