Spring WebFlux WebClient timeout()和exchange()

时间:2018-08-20 19:38:51

标签: java spring webclient spring-webflux project-reactor

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

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

spring documentation说:

  

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

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

1 个答案:

答案 0 :(得分:1)

在这种情况下,我认为这不是问题。

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