我有类似于以下示例的代码:
Mono<ResponseEntity<String>> result = webClient
.post()
.body(Mono.just(command), MyCommand.class)
.exchange()
.timeout(calculateTimeout(command))
.flatMap(clientResponse -> clientResponse.toEntity(String.class));
春季文档说:
使用exchange(( 时,必须始终使用 ClientResponse 的任何 body 或 toEntity 方法来确保释放资源并避免 HTTP 连接池的潜在问题。如果没有预期响应内容,您可以使用bodyToMono(Void.class(。但请记住,如果响应确实包含内容,则连接将关闭,并且不会放回池中。
问:如果像上面的代码一样由 timeout(...( 触发 TimeoutException,我是否必须明确执行某些操作以确保正确释放所有资源或上面的代码是否足够?我想避免在这里出现内存泄漏。
我认为在这种情况下这不是问题。
触发时,timeout
将cancel()
上游,有效地关闭连接,而不是将其返回到连接池。你不需要在这里做任何特别的事情,也不会有内存泄漏(除了已经位于反应堆内部队列中的缓冲区,这是 Spring 框架将在 SPR-17025 中解决的问题(。