вы не можете объединить SemaphoreBulkhead и TimeLimiter, так как TimeLimiter не может остановить выполнение задачи, если она работает в том же потоке.
Поэтому вы можете комбинировать только TimeLimiter и ThreadPoolBulkhead. Но это имеет смысл, только если вы хотите иметь неблокирующий / асин c код и не блокировать ваш поток.
Если вы хотите блокировать код, вы можете просто использовать:
CompletableFuture.supplyAsync(() -> service.method()).get(1, TimeUnit.SECONDS);
Если вы хотите неблокирующий код и можете использовать Java9 или выше, вы можете просто сделать:
CompletableFuture.supplyAsync(() -> service.method()).orTimeout(1, TimeUnit.SECONDS);
Новый оператор orTimeout
сравним с Resilience4j TimeLimiter.
Если вам нужно использовать Java8 и вы хотите использовать Resilience4j, тогда выполните
ThreadPoolBulkhead bulkhead = ThreadPoolBulkhead.ofDefaults("sample");
TimeLimiter timeLimiter = TimeLimiter.of(Duration.ofSeconds(1));
ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(3);
CompletableFuture<String> future = timeLimiter
.executeCompletionStage(scheduler,
bulkhead.decorateSupplier(() -> service.method())).toCompletableFuture();
TimeLimiter позволяет используйте свой собственный ScheduledExecutorService, тогда как новый оператор orTimeout
этого не делает.
Я предлагаю прочитать это сообщение в блоге -> http://iteratrlearning.com/java9/2016/09/13/java9-timeouts-completablefutures.html