如何在等待回调中保存一个对象?
How can I save aside an object in awaitility callback?
我的代码调用服务器并获得 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);
}
};
}
一种方法是制作一个记住它的专用 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,您也可以使用匿名内部 class。
您可以使用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);
我的代码调用服务器并获得 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);
}
};
}
一种方法是制作一个记住它的专用 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,您也可以使用匿名内部 class。
您可以使用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);