Spring WebFlux WebClient timeout() 和 exchange()

mio*_*mio 5 java spring webclient project-reactor spring-webflux

我有类似于以下示例的代码:

Mono<ResponseEntity<String>> result = webClient
    .post()
    .body(Mono.just(command), MyCommand.class)
    .exchange()
    .timeout(calculateTimeout(command))
    .flatMap(clientResponse -> clientResponse.toEntity(String.class));
Run Code Online (Sandbox Code Playgroud)

春天的文档说:

使用 exchange() 时,您必须始终使用 ClientResponse 的任何 body 或 toEntity 方法来确保资源被释放并避免 HTTP 连接池的潜在问题。如果不需要响应内容,您可以使用 bodyToMono(Void.class)。但是请记住,如果响应确实包含内容,则连接将关闭并且不会放回池中。

问题:如果上面的代码中的 timeout(...) 触发了 TimeoutException,我是否必须明确地做一些事情来确保所有资源都被正确释放,或者上面的代码是否足够?我想避免在这里发生内存泄漏。

Bri*_*zel 1

我认为这在本案中不是问题。

触发后,timeout将向cancel()上游,有效关闭连接,而不是将其返回到连接池。您不需要在这里做任何特殊的事情,并且不会出现内存泄漏(除了已经位于反应器内部队列中的缓冲区之外,这是 Spring Framework 将在SPR-17025中解决的问题)。