From 2ee619625e6c037a94f539c1278560d64720d096 Mon Sep 17 00:00:00 2001 From: Jonathan Cobb Date: Fri, 3 Jul 2020 22:37:44 -0400 Subject: [PATCH] await now supports caller-supplied sleepInterval and sleepCallback --- .../java/org/cobbzilla/util/daemon/Await.java | 41 +++++++++++++++++-- 1 file changed, 37 insertions(+), 4 deletions(-) diff --git a/src/main/java/org/cobbzilla/util/daemon/Await.java b/src/main/java/org/cobbzilla/util/daemon/Await.java index 1468dfa..578f1f0 100644 --- a/src/main/java/org/cobbzilla/util/daemon/Await.java +++ b/src/main/java/org/cobbzilla/util/daemon/Await.java @@ -9,8 +9,7 @@ import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; -import static org.cobbzilla.util.daemon.ZillaRuntime.die; -import static org.cobbzilla.util.daemon.ZillaRuntime.now; +import static org.cobbzilla.util.daemon.ZillaRuntime.*; import static org.cobbzilla.util.system.Sleep.sleep; @Slf4j @@ -18,6 +17,7 @@ public class Await { public static final long DEFAULT_AWAIT_GET_SLEEP = 10; public static final long DEFAULT_AWAIT_RETRY_SLEEP = 100; + public static final long DEFAULT_AWAIT_ALL_SLEEP = 200; public static E awaitFirst(Collection> futures, long timeout) throws TimeoutException { return awaitFirst(futures, timeout, DEFAULT_AWAIT_RETRY_SLEEP); @@ -136,10 +136,36 @@ public class Await { } public static AwaitResult awaitAll(Collection> futures, long timeout) { - return awaitAll(futures, timeout, ClockProvider.SYSTEM); + return awaitAll(futures, timeout, ClockProvider.SYSTEM, DEFAULT_AWAIT_ALL_SLEEP, null); } public static AwaitResult awaitAll(Collection> futures, long timeout, ClockProvider clock) { + return awaitAll(futures, timeout, clock, DEFAULT_AWAIT_ALL_SLEEP, null); + } + + public static AwaitResult awaitAll(Collection> futures, long timeout, Runnable sleepCallback) { + return awaitAll(futures, timeout, ClockProvider.SYSTEM, DEFAULT_AWAIT_ALL_SLEEP, sleepCallback); + } + + public static AwaitResult awaitAll(Collection> futures, + long timeout, + long sleepTime, + Runnable sleepCallback) { + return awaitAll(futures, timeout, ClockProvider.SYSTEM, sleepTime, sleepCallback); + } + + public static AwaitResult awaitAll(Collection> futures, + long timeout, + ClockProvider clock, + Runnable sleepCallback) { + return awaitAll(futures, timeout, clock, DEFAULT_AWAIT_ALL_SLEEP, sleepCallback); + } + + public static AwaitResult awaitAll(Collection> futures, + long timeout, + ClockProvider clock, + long sleepTime, + Runnable sleepCallback) { long start = clock.now(); final AwaitResult result = new AwaitResult<>(); final Collection> awaiting = new ArrayList<>(futures); @@ -161,7 +187,14 @@ public class Await { } } if (awaiting.isEmpty()) break; - sleep(200); + if (sleepCallback != null) { + try { + sleepCallback.run(); + } catch (Exception e) { + log.warn("awaitAll: exception in sleepCallback: "+shortError(e)); + } + } + sleep(sleepTime); } result.timeout(awaiting);