Reputation: 141
What is the correct way to set a (connection) timeout for the (default) WebClient?
Is it enough to just use Mono#timeout(Duration)
method on the resulting Mono (or Flux)? Or does this lead to a possible memory / connection leak?
Thanks in advance!
(The answers from Spring 5 webflux how to set a timeout on Webclient do not work!)
Upvotes: 4
Views: 10069
Reputation: 958
As of Reactor Netty 0.8 and Spring Framework 5.1, you can set connection, read & write timeouts like the following:
TcpClient tcpClient = TcpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000) // Connection Timeout
.doOnConnected(connection ->
connection.addHandlerLast(new ReadTimeoutHandler(10)) // Read Timeout
.addHandlerLast(new WriteTimeoutHandler(10))); // Write Timeout
WebClient webClient = WebClient.builder()
.clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
.build();
Upvotes: 9
Reputation: 59086
For now, WebClient
does not offer that option as a top-level configuration option. You have to configure that at the underlying HTTP client library.
So the answer to the other question is right. But in your case, you probably need to change the connection timeout, not the socket timeout (or both).
ReactorClientHttpConnector connector =
new ReactorClientHttpConnector(options ->
options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000));
WebClient webClient = WebClient.builder().clientConnector(connector).build();
Upvotes: 2