繁体   English   中英

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

[英]invalidate refreshed entry in Guava CacheLoader

我有一个带CacheLoader的Guava缓存。 我在一个线程中跟踪一个外部条件,如果发生这种情况,我想异步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将被记录为警告并被忽略)? 能够删除键/缺席值而不是保留占位符对象会很好。

番石榴r17目前不支持这种方法。

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM