Solución:
Para configurar el tiempo de espera de lectura y conexión, utilizo el método a continuación, porque la opción SO_TIMEOUT no está disponible para canales que usan NIO (y dando la advertencia Unknown channel option 'SO_TIMEOUT' for channel '[id: 0xa716fcb2]'
)
ReactorClientHttpConnector connector = new ReactorClientHttpConnector(
options -> options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 2000)
.compression(true)
.afterNettyContextInit(ctx -> {
ctx.addHandlerLast(new ReadTimeoutHandler(5000, TimeUnit.MILLISECONDS));
}));
return WebClient.builder()
.clientConnector(connector)
.build();
La API ReactorClientHttpConnector cambió en la versión Spring WebFlux 5.1.
Entonces hago lo siguiente (sintaxis de Kotlin, basada en el ejemplo de @joshiste):
val tcpClient = TcpClient.create()
.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10_000)
.doOnConnected { connection ->
connection.addHandlerLast(ReadTimeoutHandler(10))
.addHandlerLast(WriteTimeoutHandler(10))
}
val myWebClient = webClientBuilder
.clientConnector(ReactorClientHttpConnector(HttpClient.from(tcpClient)))
.baseUrl(myEndPoint)
.build()
El WebFlux WebClient
no utiliza el cliente HTTP Apache Commons. Aunque es posible que pueda implementar una solución a través de ClientHttpConnector
. La existencia ReactorClientHttpConnector
se basa en el Netty. Por lo tanto, considere usar las opciones de Netty para configurar el cliente, por ejemplo:
ReactorClientHttpConnector connector =
new ReactorClientHttpConnector(options ->
options.option(ChannelOption.SO_TIMEOUT, this.applicationConfig.getHttpClientConnectTimeout()));
o
.onChannelInit(channel -> channel.config().setConnectTimeoutMillis(this.applicationConfig.getHttpClientConnectTimeout()))
ACTUALIZAR
También podemos usar ReadTimeoutHandler
:
.onChannelInit(channel ->
channel.pipeline()
.addLast(new ReadTimeoutHandler(this.applicationConfig.getHttpClientConnectTimeout())))