在Guava CacheLoader中使刷新的条目无效

时间:2014-03-24 12:23:01

标签: java caching guava

我有一个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将被记录为警告并被忽略)?能够删除键/缺席值而不是保留占位符对象是一件好事。

1 个答案:

答案 0 :(得分:0)

支持的方法目前在番石榴r17中不存在。

您是否尝试获取所有密钥,然后使所有密钥无效,然后尝试获取您保存的所有密钥?

Set<ResourceLoaderKey> keys = resourceLoaderCache.asMap().keySet();
resourceLoaderCache.invalidateAll(keys);
for(ResourceLoaderKey k : keys) {
    resourceLoaderCache.get(k);        //or getUnchecked() whichever you prefer
}

这应该确保缓存中没有过时的值,并重新存储所有存在的值。

(我的问题略有不同,我不得不改变我的假设来解决我的问题)