Мы используем org.springframework.web.reactive.function.client.WebClient
с reactor.netty.http.client.HttpClient
как часть Spring 5.1.9 для выполнения запросов с использованием метода exchange()
. Документация для этого метода подчеркивает следующее:
... при использовании exchange () приложение несет ответственность за использование любого содержимого ответа независимо от сценария ( успех, ошибка, неожиданные данные и т. д. c). Невыполнение этого требования может привести к утечке памяти.
Наше использование exchange()
довольно основательно c, но документация для сценария ошибок ios мне неясна, и я хочу быть уверен что мы правильно высвобождаем ресурсы для всех результатов. По сути, у нас есть блокирующая реализация, которая делает запрос и возвращает ResponseEntity
независимо от кода ответа:
try {
...
ClientResponse resp = client.method(method).uri(uri).syncBody(body).exchange().block();
ResponseEntity<String> entity = resp.toEntity(String.class).block();
return entity;
} catch (Exception e) {
// log error details, return internal server error
}
Если я понимаю реализацию, exchange()
всегда даст нам ответ, если запрос был успешно отправлен независимо от кода ответа (например, 4xx, 5xx). В этом случае нам просто нужно вызвать toEntity()
, чтобы получить ответ. Меня беспокоит сценарий ошибок ios (например, нет ответа, ошибки соединения низкого уровня и т. Д. c). Будет ли описанная выше обработка исключений охватывать все другие сценарии ios и будет ли у любого из них ответ, который необходимо использовать?
Примечание: ClientResponse.releaseBody()
был введен только в 5.2