Как выполнить CompletableFuture асинхронно - PullRequest
0 голосов
/ 06 мая 2020

Я создал метод, реализующий асинхронный c шаблон повтора. На самом деле, я хочу, чтобы, когда я вызываю этот метод, запрос должен обрабатываться в отдельном потоке, и он должен повторить попытку с некоторой задержкой

private <R> CompletableFuture<R> withRetryRequest(Supplier<CompletableFuture<R>> supplier, int maxRetries) {
        CompletableFuture<R> f = supplier.get();
        for (int i = 0; i < maxRetries; i++) {
            f = f.thenApply(CompletableFuture::completedFuture)
                    .exceptionally(t -> {
                        try {
                            Thread.sleep(10 * 1000);
                        } catch (Exception exp) {
                            log.log(Level.SEVERE, "Error while delay executing", exp);
                        }
                        return supplier.get();
                    })
                    .thenCompose(Function.identity());
        }
        return f;
    }

вот часть вызывающего:

ThreadPoolExecutor executor = (ThreadPoolExecutor) Executors.newFixedThreadPool(PropUtil.getPropUtil().THREAD_POOL_SIZE);

CompletableFuture<Boolean> retry = this.withRetryRequest(() -> runDoorOpenProcedure(req), req.getRetryCount());

final CompletableFuture<Boolean> retryFinal = retry;
CompletableFuture<CompletableFuture<Boolean>> retryRes = CompletableFuture.supplyAsync(() -> retryFinal, executor);
Boolean success = retry.get().join();

Но это кажется, что вызов вообще не асинхронный c. Что я здесь делаю не так, может кто-нибудь взглянуть на это?

1 Ответ

2 голосов
/ 06 мая 2020

проверьте это: https://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/

CompletedFuture подходит для некоторых сценариев ios, например, вы хотите разделить свои задачи на параллельные, но вам все еще нужен результат задачи для продолжения или агрегирования, тогда ваш основной поток ждет, пока вы не получите все результаты от всех подзадач. Основной поток блокируется при выполнении подзадач.

Если вам не нужны результаты асинхронных c задач, вы можете создать Thread и передать их в ThreadPool, а затем вернуть.

...