我有一个CacheLoader
的番石榴缓存。我在线程中跟踪了一个外部条件,如果发生这种情况,我想异步refresh()
所有条目。出于这个原因,我不使用invalidateAll()
,因为下一个get()
必须等待加载成功。
相反,我迭代缓存中包含的密钥和refresh(k)
所有密钥,因为我找不到refreshAll()方法。这是代码(但与问题无关):
Set<ResourceLoaderKey> keys = resourceLoaderCache.asMap().keySet();
for(ResourceLoaderKey k : keys)
{
resourceLoaderCache.refresh(k);
}
现在我的问题是,CacheLoader中的reload()
可能检测到资源实际上不再可用。目前reload()
抛出一个适用于get()
情况的ResourceNotFound异常。但它不适用于refresh()
情况,因为只要reload()
失败就会提供旧值。
我现在可以在加载/重新加载方法中捕获未找到的异常并以某种方式使条目无效,但我想知道是否有正式方法(返回null或null将被记录为警告并被忽略)?能够删除键/缺席值而不是保留占位符对象是一件好事。
答案 0 :(得分:0)
支持的方法目前在番石榴r17中不存在。
您是否尝试获取所有密钥,然后使所有密钥无效,然后尝试获取您保存的所有密钥?
Set<ResourceLoaderKey> keys = resourceLoaderCache.asMap().keySet();
resourceLoaderCache.invalidateAll(keys);
for(ResourceLoaderKey k : keys) {
resourceLoaderCache.get(k); //or getUnchecked() whichever you prefer
}
这应该确保缓存中没有过时的值,并重新存储所有存在的值。
(我的问题略有不同,我不得不改变我的假设来解决我的问题)