如何在等待回调中保存对象?
Posted
技术标签:
【中文标题】如何在等待回调中保存对象?【英文标题】:How can I save aside an object in awaitility callback? 【发布时间】:2016-09-11 08:32:27 【问题描述】:我的代码调用服务器并获得old-response
。
然后我想进行轮询,直到我得到来自服务器的不同响应(又名new-response
)。
我使用while循环我可以持有new-response
并在轮询后使用它。
如果我使用awaitility
,如何轻松获得new-response
?
这是我的代码:
public Version waitForNewConfig() throws Exception
Version oldVersion = deploymentClient.getCurrentConfigVersion(appName);
await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(newVersionIsReady(oldVersion));
Version newVersion = deploymentClient.getCurrentConfigVersion(appName);
private Callable<Boolean> newVersionIsReady(Version oldVersion)
return new Callable<Boolean>()
public Boolean call() throws Exception
Version newVersion = deploymentClient.getCurrentConfigVersion(appName);
return !oldVersion.equals(newVersion);
;
【问题讨论】:
【参考方案1】:您可以使用ConditionFactory.until(Callable[T], Predicate[T])
例如:
Callable<MyObject> supplier = () -> queryForMyObject();
Predicate<MyObject> predicate = myObject -> myObject.getFooCount() > 3;
MyObject myObject = Awaitility.await()
.atMost(1, TimeUnit.MINUTE)
.pollInterval(Duration.ofSeconds(5))
.until(supplier, predicate);
doStuff(myObject);
【讨论】:
【参考方案2】:一种方法是制作一个专门的 Callable 实现来记住它:
public Version waitForNewConfig() throws Exception
NewVersionIsReady newVersionIsReady = new NewVersionIsReady(deploymentClient.getCurrentConfigVersion(appName));
await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(newVersionIsReady);
return newVersionIsReady.getNewVersion();
private final class NewVersionIsReady implements Callable<Boolean>
private final Version oldVersion;
private Version newVersion;
private NewVersionIsReady(Version oldVersion)
this.oldVersion = oldVersion;
public Boolean call() throws Exception
Version newVersion = deploymentClient.getCurrentConfigVersion(appName);
return !oldVersion.equals(newVersion);
public Version getNewVersion()
return newVersion;
另一种是将其存储在容器中(以我使用数组为例)
public Version waitForNewConfig() throws Exception
Version[] currentVersionHolder = new Version[1];
Version oldVersion = deploymentClient.getCurrentConfigVersion(appName);
await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(() ->
Version newVersion = deploymentClient.getCurrentConfigVersion(appName);
currentVersionHolder[0] = newVersion;
return !oldVersion.equals(newVersion);
);
return currentVersionHolder[0];
如果你还没有使用 java 8,你也可以使用匿名内部类。
【讨论】:
以上是关于如何在等待回调中保存对象?的主要内容,如果未能解决你的问题,请参考以下文章