#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.