gpt4 book ai didi

java - Guava 中的条件内存

转载 作者:行者123 更新时间:2023-11-30 01:45:17 26 4
gpt4 key购买 nike

我知道如何memoize a single object 。但是,我只想在满足某些条件的情况下记住。我调用的服务有时会返回不成功的响应。仅当服务响应成功时我才想记住。

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();
}
}

但是,在此解决方案中,如果缓存为空且服务返回不成功的响应,则会立即再次调用。

最佳答案

您可以在 Service 类或任何其他合适的位置创建一个方法 callUntilSuccess (这里我假设它在您的 Service 中)。您还可以在此方法中定义最大尝试次数,之后它将返回 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);
}

关于java - Guava 中的条件内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58269625/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com