Elad Benda2 Elad Benda2 - 2 months ago 8
Java Question

how can i save aside an object in awaitility callback

My code calls a server and get an

old-response
.

Then I want to poll till I get a different response from the server (aka
new-response
).

I i use while loop I can hold the
new-response
and use it after polling.

If I use
awaitility
how can I get the
new-response
easily?

Here is my code:

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

Answer

One way is to make a specialized Callable implementation that remembers it :

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

Another is to store it in a container (as an example I use an array)

public Version waitForNewConfig() throws Exception {
    Version[] currentVersionHolder = new Version[1];
    Version oldVersion = deploymentClient.getCurrentConfigVersion(appName);
    await().atMost(1, MINUTES).pollInterval(5, SECONDS).until(() -> {
        Version newVersion1 = deploymentClient.getCurrentConfigVersion(appName);
        currentVersionHolder[0] = newVersion1;
        return !oldVersion.equals(newVersion1);
    });

    return currentVersionHolder[0];
}

If you don't use java 8 yet, you can do it using an anonymous inner class as well.

Comments