在Resilience4j中集成断路器,重试和时间限制器

时间:2020-02-13 20:59:58

标签: resilience4j

我正在尝试使用Resilience4j功能。我的用例是组合断路器,重试和时间限制器模块。这是我尝试过的。

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

这里的问题是,我的doSomething()方法执行两次。有人较早看到此问题吗?我想组合所有这些模块,并且只执行一次该方法。 谢谢你的帮助。

1 个答案:

答案 0 :(得分:3)

您正在使用timeLimiter.executeFutureSupplier来执行Future而不是装饰它。 请按照以下顺序使用它:

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