Повтор моно после истечения времени ожидания при отмене CompletableFuture в полете - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь выполнить следующие действия в реакторе проекта:

  • Попробуйте выполнить операцию на срок до х
  • Тайм-аут, если не завершен
  • отменить / kill процесса, который был порожден
  • , затем повторите операцию снова x раз

Вот пример кода для демонстрации:

AtomicInteger i = new AtomicInteger();
int finalRunNumber = Mono.fromFuture(() -> CompletableFuture.supplyAsync(() -> {
    int runNumber = i.incrementAndGet();
    System.out.println("Started run: " + runNumber);
    try {
        Thread.sleep(Duration.ofSeconds(5).minusSeconds(runNumber).toMillis());
    } catch (InterruptedException e) {
        System.out.println("Interrupted run: " + runNumber);
        throw new RuntimeException(e);
    }
    System.out.println("Finished run: " + runNumber);
    return runNumber;
}))
        .timeout(Duration.ofMillis(2_500))
        .doFinally(signalType -> {
            System.out.println("doFinally signal: " + signalType);
        })
        .retry(4)
        .block();

System.out.println("Final returned run number: " + finalRunNumber);

, который выдает журнал заявление о:

Started run: 1
Started run: 2
doFinally signal: onError
Finished run: 1
Started run: 3
doFinally signal: onError
Finished run: 2
Finished run: 3
Final returned run number: 3

Как мне сделать так, чтобы он выдавал журнал, который может отменить бортовой CompletableFutures, и выдавать журнал как:

Started run: 1
Started run: 2
Interrupted run: 1
doFinally signal: onError
Started run: 3
Interrupted run: 2
doFinally signal: onError
Finished run: 3
Final returned run number: 3

Просмотр реактора проекта Документация Mono.fromFuture в нем есть примечание о том, что будущее не отменяется и должно быть отменено в doFinally, в котором нет ссылки на CompletableFuture, сгенерированный из Supplier (необходим для повторных попыток работать), следовательно, на CompletableFuture, как видно из документации, не существует способа вызвать отмену вызова. У кого-нибудь еще есть идеи, как это сделать? 1028 *? 1027 *

...