Интеграция автоматического выключателя, повторных попыток и ограничителя времени в Resilience4j - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь использовать функции Resilience4j. Мой пример использования - объединение модулей автоматического выключателя, повтора и ограничителя времени. Вот что я попробовал.

  Supplier<R> supplier = this::doSomething;
  timeLimiter.executeFutureSupplier(
          () -> CompletableFuture.supplyAsync(supplier));
  return Decorators.ofSupplier(supplier)
            .withCircuitBreaker(circuitBreaker)
            .withRetry(retry)
            .withBulkhead(bulkhead)
            .decorate();

Проблема здесь в том, что мой метод doSomething () выполняется дважды. Кто-нибудь видел эту проблему раньше? Я хочу объединить все эти модули и выполнить метод только один раз. Спасибо за вашу помощь.

1 Ответ

1 голос
/ 14 февраля 2020

вы используете timeLimiter.executeFutureSupplier, который выполняет будущее вместо того, чтобы украшать его. Пожалуйста, используйте его именно в таком порядке:

ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
Supplier<R> supplier = this::doSomething;

CompletableFuture<R> future = Decorators.ofSupplier(supplier)
    .withThreadPoolBulkhead(threadPoolBulkhead)
    .withTimeLimiter(timeLimiter, scheduledExecutorService)
    .withCircuitBreaker(circuitBreaker)
    .withRetry(retry)
    .get().toCompletableFuture();
...