/** @deprecated since 0.9.0 use {@link #continually(Supplier, Predicate, Duration, Duration, String)} */ @Deprecated public static <T> void continually(Map<String,?> flags, Supplier<? extends T> supplier, Predicate<T> predicate, String errMsg) { continually(supplier, predicate, toDuration(flags.get("timeout"), toDuration(flags.get("duration"), null)), toDuration(flags.get("period"), null), null); } /**
/** @deprecated since 0.9.0 use {@link #eventually(Supplier, Predicate, Duration, Duration, String)} */ @Deprecated public static <T> void eventually(Map<String,?> flags, Supplier<? extends T> supplier, Predicate<T> predicate, String errMsg) { eventually(supplier, predicate, toDuration(flags.get("timeout"), null), toDuration(flags.get("period"), null), errMsg); }
public static <T> T succeedsContinually(Map<?,?> flags, Callable<T> job) { Duration duration = toDuration(flags.get("timeout"), DEFAULT_SHORT_TIMEOUT); Duration period = toDuration(flags.get("period"), Duration.millis(10)); long periodMs = period.toMilliseconds(); long startTime = System.currentTimeMillis(); long expireTime = startTime+duration.toMilliseconds(); int attempt = 0; boolean first = true; T result = null; while (first || System.currentTimeMillis() <= expireTime) { attempt++; try { result = job.call(); } catch (Exception e) { log.info("succeedsContinually failed - {} attempts lasting {} ms, for {} (rethrowing)", new Object[] {attempt, System.currentTimeMillis()-startTime, job}); throw propagate(e); } if (periodMs > 0) sleep(periodMs); first = false; } return result; }
Duration duration = toDuration(flags.get("timeout"), DEFAULT_LONG_TIMEOUT); Duration fixedPeriod = toDuration(flags.get("period"), null); Duration minPeriod = (fixedPeriod != null) ? fixedPeriod : toDuration(flags.get("minPeriod"), Duration.millis(1)); Duration maxPeriod = (fixedPeriod != null) ? fixedPeriod : toDuration(flags.get("maxPeriod"), Duration.millis(500)); int maxAttempts = get(flags, "maxAttempts", Integer.MAX_VALUE); int attempt = 0;