java - Guava 中的条件记忆
问题描述
我知道如何记忆单个对象。但是,我只想在满足某些条件的情况下进行记忆。我正在调用一项服务,该服务有时会返回不成功的响应。如果服务响应成功,我只想记住它。
MyResponse myResponse = myService.call()
boolean success = myResponse.isSuccessful();
我的缓存是这样创建的:
private Supplier<MyResponse> cache;
private void createCache() {
this.cache = Suppliers
.memoizeWithExpiration(myService::call, timeout,
TimeUnit.MINUTES);
}
问题: 仅当使用传递给memoizeWithExpiration
方法的供应商成功响应时,是否可以以某种方式缓存响应?
我发现这样做的唯一解决方法是,在检索值时,cache.get()
首先调用,检查存储在缓存中的对象是否成功,如果不是,createCache()
再次调用以清除它,然后再次获取值。这样,如果后续的服务调用返回一个有效的对象,它将被存储,如果不是,每个后续调用都会清除缓存并再次调用该服务。
public MyResponse getResponse() {
MyResponse myResponse = cache.get();
if (myResponse.isSuccess()) {
return myResponse;
} else {
createCache();
return cache.get();
}
}
但是,在这个解决方案中,如果缓存为空并且服务返回不成功的响应,它将立即再次调用。
解决方案
您可以在服务类或任何其他合适的地方创建一个方法callUntilSuccess
(这里我假设它在您的服务中)。您还可以在此方法中定义最大尝试次数,之后它将返回 null,因此您可以避免无限期地调用您的服务(此建议未在下面提供的代码中实现,但这样做很容易)。由于 Guava 方法需要一个供应商,您甚至可以使用此逻辑创建一个 lambda 并将其直接传递给该memoizeWithExpiration
方法。
public MyResponse callUntilSuccess() {
MyResponse response = myService.call();
while (!response.isSuccessful()) {
response = myService.call();
}
return response;
}
然后以这种方式进行记忆:
private void createCache() {
this.cache = Suppliers
.memoizeWithExpiration(myService::callUntilSuccess, timeout,
TimeUnit.MINUTES);
}
推荐阅读
- python - 使用 pip 安装 Numpy 后出现问题:poly fit 条件不佳
- python - 在pygame中单独移动目标
- node.js - 在 NodeJS 工作线程中执行网络 I/O 的问题
- php - 我可以在 PHP 的 echo 语句中使用 strtolower() 之类的函数吗?
- json - Json 发布到 asp.net 核心剃须刀页面模型返回 null
- python - 如何使用 group by 将 pyspark df 制作成嵌套数组
- html - 隐藏页面中的 div 并使其仅在 print bootstrap 4 上可见
- javascript - 防止在 Angular 8 中多次运行相同的服务
- r - 如何通过迭代组合存储在数据框中的变量名称来构建两个字符串的列表,以便每一列都有一个
- c++ - 多维数组,else语句如何显示一次?