Какие исключения могут быть вызваны exchange () в WebClient?

#reactor-netty #spring-webclient

#reactor-netty #весна-веб-клиент #spring-webclient

Вопрос:

Я внедрил службу, которая вызывает вызовы 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:

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

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

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

java.net.UnknownHostException

Соединение отклонено (порт не открыт на сервере)

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

reactor-netty выдает io.netty.channel.AbstractChannel$AnnotatedConnectException

Тайм-аут подключения

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

reactor-netty выдает 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 , если декодирование настроено неправильно

Тайм-аут чтения

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

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

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

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

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

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

reactor-netty выдает reactor.netty.http.client.PrematureCloseException

Прочее

Любые исключения, возникающие во время someResponseHandler::handleResponse

Комментарии:

1. Спасибо. Сложность с использованием моих собственных тестов для определения того, какие типы исключений могут быть сгенерированы, заключается в том, что я никогда не узнаю, что я перехватил каждый сценарий. Но в конечном итоге, я думаю, что я составил очень похожий на ваш список, просто посмотрев на стандартные исключения Java bog, которые могут быть сгенерированы при использовании сокетов и т. Д.

2. Спасибо! Можете ли вы добавить код, чтобы показать нам, как протестировать эти исключения? Я не могу понять, как MockWebServer может помочь мне протестировать исключения WriteTimeoutException и ConnectionTimeoutException.