我正在尝试使用Resilience4j功能。我的用例是组合断路器,重试和时间限制器模块。这是我尝试过的。
Supplier<R> supplier = this::doSomething;
timeLimiter.executeFutureSupplier(
() -> CompletableFuture.supplyAsync(supplier));
return Decorators.ofSupplier(supplier)
.withCircuitBreaker(circuitBreaker)
.withRetry(retry)
.withBulkhead(bulkhead)
.decorate();
这里的问题是,我的doSomething()方法执行两次。有人较早看到此问题吗?我想组合所有这些模块,并且只执行一次该方法。 谢谢你的帮助。
答案 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();