Объединить результат из нескольких монос, когда число не является фиксированным? - PullRequest
0 голосов
/ 21 сентября 2018

Как объединить список Monos в один Mono.Прямо сейчас я звоню, скажем, 5 службам, и два из вызовов были успешными, но три из них могли бы потерпеть неудачу. Я хочу отследить все те, которые отказали и которые все преуспели.Я попытался использовать Mono.zipdelayError, но он не работает таким образом.Всякий раз, когда возникает ошибка, она приходит к моему обработчику исключений ресурса.

Просто для информации, я предоставил API отдыха, который внутренне вызовет ряд служб, которые возвращают моно, и я должен объединить результат этих вызовов в одинMono.

Mono<String> error = Mono.error(new RuntimeException());

    error.onErrorResume(throwable-> Mono.just("hell0"));

    Mono<String> test = Mono.just("test");
    Mono<String> test1 = Mono.just("test1");
    Mono<String> test2 = Mono.just("test2");

    List<Mono<String>> monolist = new ArrayList<>();
    monolist.add(test);
    monolist.add(test1);
    monolist.add(test2);
    monolist.add(error);
     Mono<Long> zipDelayError = Mono.zipDelayError(monolist, arrayObj -> Arrays.stream(arrayObj).count());

    System.out.println(zipDelayError.block()); 

Сейчас ломается.

1 Ответ

0 голосов
/ 21 сентября 2018

Как указано в , проект реактора Javadoc для Mono, Mono.zip будет:

Объединить данные моно в новый моно, которое будет выполнено, когда вседанные моносы произвели элемент, агрегируя их значения в соответствии с предоставленной функцией комбинатора.Ошибка или пустое завершение любого источника приведет к тому, что другие источники будут отменены, и получающийся в результате Mono немедленно выдаст ошибку или завершится, соответственно.

Это означает, что для следующего примера:

Mono<User> user = ...
Mono<Account> account = ...
Mono<Info> info = ...
Mono<Tuple3<User, Account, Info>> tuple = Mono.zip(user, account, info);

Вы также получаете:

  • Tuple, содержащий все 3 значения, если все прошло нормально
  • пустое Mono, если одно из них завершено как пустое
  • сигнал об ошибке в случае сбоя одного из них

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

Есть много способов получить более детальное поведение.

Вы можете, в архиве Monoили любой вышестоящий, добавьте doOnError операторов для регистрации информации, если что-то не так, или даже onErrorResume для использования резервных операций;Вы также можете связать retry операторов, чтобы описать, как / когда следует повторить попытку в случае сбоев.

...