Saltar al contenido

Cómo establecer un tiempo de espera en Spring 5 WebFlux WebClient

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())))
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *