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