如何处理Google Guava Cache刷新异常?

时间:2012-07-25 01:36:45

标签: guava

Google Guava缓存文档指出:

  

刷新与驱逐并不完全相同。正如在LoadingCache.refresh(K)中指定的那样,刷新密钥会加载密钥的新值,可能是异步的。在刷新密钥时仍会返回旧值(如果有),与驱逐相反,驱逐会强制检索等待,直到重新加载该值。

     

如果在刷新时抛出异常,则保留旧值,并且   记录并吞下异常。

在我的用例中,这种异常的记录和吞没非常糟糕,因为这意味着如果刷新抛出异常,则缓存的用户将继续在缓存中找到陈旧数据。

如何确保在刷新时抛出异常,缓存开始返回null或调用load方法?

1 个答案:

答案 0 :(得分:8)

如果您不想提供陈旧数据,则应拨打invalidate(key)而不是refresh(key)。这会丢弃key的缓存值(如果存在)。

然后对get(key)的后续调用将同步委托给值加载器,并将重新抛出CacheLoader抛出的任何异常,包含在(Unchecked)ExecutionException中。