我的代码类似于以下示例:
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时,我是否必须明确地做一些事情以确保所有资源都被正确释放,或者上面的代码是否足够?我想避免这里发生内存泄漏。
答案 0 :(得分:1)
在这种情况下,我认为这不是问题。
被触发时,timeout
将向cancel()
上游,从而有效地关闭连接并将其不返回到连接池。您无需在这里做任何特殊的事情,也不会发生内存泄漏(除了已经位于反应堆内部队列中的缓冲区之外,这是Spring Framework在SPR-17025中要解决的问题)。