Resilience4j возвращает CompletableFuture вокруг проверенного метода - PullRequest
0 голосов
/ 29 мая 2020

Я не могу понять, как обернуть синхронный метод в Resilience4j, чтобы он возвращал CompletableFuture, хотя, похоже, это часть области Resilience4j target . Тем более, что синхронный метод, который я хочу обернуть, может вызвать исключение. Что я хочу в псевдокоде:

boolean void syncMethod() throws Exception {
    // May throw Exception due to connection/authorization problems.
}

CompletableFuture<Boolean> asyncResilience4jWrapper() {
    CompletableFuture<Boolean> result = 
        ...
            Resilience4j magic around "syncMethod()". 
            Trying 4 calls, interval between calls of 100 ms. 
        ...;
    return result;
}

Resilience4j должен просто попытаться вызвать метод 4 раза, пока он не откажется, с интервалами между вызовами 100 мс, а затем завершить асинхронный вызов. Вызывающий asyncResilience4jWrapper должен просто вернуть CompletableFuture, который не блокирует и не заботится ни о чем из этого.

1 Ответ

2 голосов
/ 29 мая 2020
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
TimeLimiter timeLimiter = TimeLimiter.of(Duration.ofSeconds(1));

CompletableFuture<Boolean> future = Decorators.ofCallable(() -> syncMethod)
    .withThreadPoolBulkhead(threadPoolBulkhead)
    .withTimeLimiter(timeLimiter, scheduledExecutorService)
    .withCircuitBreaker(circuitBreaker)
    .withFallback(asList(TimeoutException.class, CallNotPermittedException.class, BulkheadFullException.class),
      throwable -> "Hello from Recovery")
    .get().toCompletableFuture();

Просто добавьте withRetry под CircuitBreaker.

...