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

ams*_*ams 6 guava

Google Guava缓存文档指出:

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

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

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

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

Mar*_*ers 8

如果您从不想提供陈旧数据,则应该调用invalidate(key)而不是refresh(key).key如果存在,则丢弃缓存的值.

然后一个后续的调用get(key)将同步委托给值加载器,并将重新抛出由CacheLoader包装的一个异常抛出的异常(Unchecked)ExecutionException.