Как правильно обработать ошибки внутри Flux в Reactor Netty?

  • 6 сентября 2023 г. 15:18
Ответы на вопрос 2
Вариант реализации:

public Publisher<Void> sendMyFlux(HttpServerRequest req, HttpServerResponse resp) {

  return myFlux
    .collectList()
    .flatMap(data -> {
      return resp
        .status(HttpResponseStatus.OK)
        .addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
        .sendString(Flux.just("Success"))
        .then();
    })
    .onErrorResume(error -> {
      return resp
        .status(HttpResponseStatus.BAD_REQUEST)
        .addHeader(ACCESS_CONTROL_ALLOW_ORIGIN, "*")
        .sendString(error.getMessage())
        .then();
    });
}

В этом примере мы используем оператор `.then()` вместо метода `.sendString()`, чтобы вернуть тип `Mono<Void>`, который требуется для функции типа `Publisher<Void>`.

Также мы переместили оператор `.onErrorResume()` вне оператора `.flatMap()`, чтобы он стал одним из основных операторов в цепочке реактивных операций. Это позволяет ему отлавливать ошибки, возникшие во время выполнения `myFlux`, и обрабатывать их соответствующим образом.

В результате, если `myFlux` завершается без ошибок, будет отправлен успешный ответ с кодом состояния 200 и сообщением "Success". Если `myFlux` завершается с ошибкой, будет отправлен ответ с кодом состояния 400 и сообщением об ошибке, полученным с помощью `error.getMessage()`.
- Создайте свой класс, который будет представлять флюкс. В этом классе должны быть два поля: статус и строка.
- Реализуйте логику, чтобы значение статуса зависело от содержимого флюкса.
- Для обработки исключений и добавления информации к ответу используйте метод .onErrorResume.
Похожие вопросы