我如何保存一个对象在可用性回调



我的代码调用服务器并获得old-response

然后我想轮询,直到我从服务器(aka 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);
        }
    };
}

您可以使用ConditionFactory。直到(可调用[T],谓词[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);

一种方法是创建一个专门的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,你也可以使用一个匿名的内部类。

相关内容

  • 没有找到相关文章

最新更新