代码之家  ›  专栏  ›  技术社区  ›  mio

Spring WebFlux WebClient timeout()和exchange()

  •  3
  • mio  · 技术社区  · 6 年前

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

    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)。但是请记住,如果响应确实包含内容,则连接将关闭,并且不会放回池中。

    问题:如果超时(…)触发TimeoutException,如上面的代码所示,我需要做一些明确的事情来确保所有资源都被正确释放,还是上面的代码足够了?我想避免这里的内存泄漏。

    1 回复  |  直到 6 年前
        1
  •  1
  •   Brian Clozel    6 年前

    我不认为这是本案的问题。

    timeout cancel() 上游,有效地关闭连接,而不将其返回到连接池。这里不需要做任何特殊的事情,也不会出现内存泄漏(除了缓冲区已经位于reactor内部队列中之外,这是Spring框架在 SPR-17025