Какие исключения могут быть выброшены exchange () на WebClient? - PullRequest
0 голосов
/ 10 апреля 2019

Я реализовал сервис, который заставляет ReST обращаться к другим сервисам для реализации части его функциональности.Я использую реактивный WebClient для этого, что-то вроде:

webClient.post()
    .uri(....)
    .contentType(....)
    .accept(....)
    .header(....)
    .syncBody(someRequestObject)
    .exchange()
    .flatMap(someResponseHandler::handleResponse)
    .doOnError(throwable -> {
        // do interesting things depending on throwable
    })
    .retry(1, this::somePredicateDependingOnThrowable);

Теперь ... Я обрабатываю HTTP-статусы в someResponseHandler::handleResponse, но я действительно хочу знать, что другие виды исключений / ошибок, ожидаемые от exchange() - то есть

  • какие исключения / ошибки я получу, если вообще не смогу подключиться к нисходящему сервису?
  • Какие исключения / ошибки я получу, если истечет время ожидания попытки подключения?
  • Какие исключения / ошибки я получу, если смогу подключиться, но затем истечет время ожидания запроса, прежде чем я получу ответ?

Очевидно, что ни один из них не является HTTP-кодом состояния, но я не могу найти никакой документации, чтобы сказать мне, что я могу искать.Я просто не смотрю в нужных местах?Я просмотрел документацию по реактивному WebClient и просмотрел Справочное руководство по Reactor Netty, но не повезло.

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

1 Ответ

1 голос
/ 21 апреля 2019

Я рекомендую протестировать ваш код, использующий WebClient, чтобы увидеть, как он обрабатывает различные упомянутые вами сценарии. Вы можете легко проверить свой код на что-то вроде MockWebServer из модульных тестов. MockWebServer может симулировать большинство ошибок, упомянутых здесь.

Сказав это, вот что я видел в своем тестировании при использовании WebClient с ReactorClientHttpConnector. Другие соединители могут выдавать немного другие исключения, но, вероятно, будут иметь общий класс в иерархии классов исключений, как указано ниже.

Неизвестный хост

java.net.UnknownHostException

В соединении отказано (порт не открыт на сервере)

java.net.ConnectException (или подкласс)

реактор-нетти io.netty.channel.AbstractChannel$AnnotatedConnectException

Время ожидания подключения

Если у вас настроен тайм-аут соединения , то вы получите java.net.ConnectException (или подкласс)

реактор-нетти io.netty.channel.ConnectTimeoutException

Ошибка SSL-квитирования

javax.net.ssl.SSLHandshakeException (или подкласс)

Ошибка кодировки тела запроса

Это зависит от используемого кодера, но обычно будет org.springframework.core.codec.EncodingException (или подкласс)

Некоторые кодировщики также выдают java.lang.IllegalStateException, если кодировка настроена неправильно

Ошибка декодирования тела ответа

Это зависит от используемого декодера, но обычно будет org.springframework.core.codec.DecodingException (или подкласс)

Некоторые декодеры также выдают java.lang.IllegalStateException, если декодирование настроено неправильно

Время ожидания чтения

Если вы используете реактор-нетто, и вы настроили io.netty.handler.timeout.ReadTimeoutHandler, то io.netty.handler.timeout.ReadTimeoutException

Если вы используете оператор .timeout где-нибудь в цепочке вызовов реактивного потока, тогда java.util.concurrent.TimeoutException

Время ожидания записи

Если вы используете реактор-нетто, и вы настроили io.netty.handler.timeout.WriteTimeoutHandler, тогда io.netty.handler.timeout.WriteTimeoutException

Соединение закрыто сервером преждевременно (до завершения ответа)

java.io.IOException (или подкласс)

реактор-нетти reactor.netty.http.client.PrematureCloseException

Другие

Любые исключения, которые происходят во время вашего someResponseHandler::handleResponse

...