【发布时间】:2020-06-03 21:17:06
【问题描述】:
我们将org.springframework.web.reactive.function.client.WebClient 与
reactor.netty.http.client.HttpClient 作为 Spring 5.1.9 的一部分使用 exchange() 方法发出请求。此方法的documentation 突出显示以下内容:
... 使用 exchange() 时,由应用程序负责 无论场景如何(成功, 错误、意外数据等)。不这样做会导致内存泄漏。
我们对exchange() 的使用相当基本,但我不清楚错误场景的文档,我想确定我们正在为所有结果正确释放资源。本质上,我们有一个阻塞实现,它发出请求并返回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() 来使用响应。我关心的是错误场景(例如,无响应、低级连接错误等)。上述异常处理是否会捕获所有其他场景,并且它们中的任何一个都有需要消耗的响应?
注意:ClientResponse.releaseBody() 仅在 5.2 中引入
【问题讨论】:
标签: java spring reactor spring-webclient