web-dev-qa-db-fra.com

définir un délai d'expiration dans Spring WebFlux webclient

J'utilise Spring Webflux WebClient pour effectuer un appel REST à partir de mon application de démarrage Spring. Et chaque fois que j'obtiens un délai d'expiration en 30 secondes.

Voici un code que j'ai essayé de définir le délai d'expiration du socket dans WebClient de Spring webfulx.

 - ReactorClientHttpConnector connector = new ReactorClientHttpConnector(options -> options
           .option(ChannelOption.SO_TIMEOUT, 600000).option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 600000));
 - ReactorClientHttpConnector connector = new ReactorClientHttpConnector(
           options -> options.afterChannelInit(chan -> {
                chan.pipeline().addLast(new ReadTimeoutHandler(600000));
            }));
 - ReactorClientHttpConnector connector1 = new ReactorClientHttpConnector(options -> options
            .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 600000).afterNettyContextInit(ctx -> {
                ctx.addHandlerLast(new ReadTimeoutHandler(600000, TimeUnit.MILLISECONDS));
            }));

Et j'ai essayé d'ajouter ce paramètre de connecteur ci-dessus dans "WebClient" en utilisant la méthode "clientConnector".

Et également essayé de définir le délai d'expiration comme ci-dessous:

webClient.get().uri(builder -> builder.path("/result/{name}/sets")
                    .queryParam("q", "kind:RECORDS")
                    .queryParam("offset", offset)
                    .queryParam("limit", RECORD_COUNT_LIMIT)
                    .build(name))
            .header(HttpHeaders.AUTHORIZATION, accessToken)
            .exchange().timeout(Duration.ofMillis(600000))
            .flatMap(response -> handleResponse(response, name, offset));

Aucune des options ci-dessus ne fonctionne pour moi.

J'utilise org.springframework.boot: spring-boot-gradle-plugin: 2.0.0.M7 qui a en interne la dépendance d'org.springframework: spring-webflux: 5.0.2.RELEASE.

Veuillez suggérer ici et faites-moi savoir si je fais quelque chose de mal ici.

9
Abhishek Pawnikar

J'ai essayé de reproduire le problème et je n'ai pas pu. Utilisation de réacteur-netty 0.7.5.LELEASE.

Je ne sais pas de quel délai vous parlez.

Le délai de connexion peut être configuré avec ChannelOption.CONNECT_TIMEOUT_MILLIS. Je reçois 10 secondes entre le message du journal de "connexion" et l'erreur réelle:

WebClient webClient = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(options -> options
        .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10000)))
    .build();

webClient.get().uri("http://10.0.0.1/resource").exchange()
    .doOnSubscribe(subscription -> logger.info("connecting"))
    .then()
    .doOnError(err -> logger.severe(err.getMessage()))
    .block();

Si vous parlez de délais d'expiration en lecture/écriture, vous pouvez consulter ReadTimeoutHandler et WriteTimeoutHandler de Netty.

Un exemple complet pourrait ressembler à ceci:

ReactorClientHttpConnector connector = new ReactorClientHttpConnector(options ->
        options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 10)
                .onChannelInit(channel -> {
                        channel.pipeline().addLast(new ReadTimeoutHandler(10))
                                .addLast(new WriteTimeoutHandler(10));
                return true;
        }).build());

Depuis Reactor Netty 0.8 et Spring Framework 5.1, la configuration ressemble maintenant à ceci:

TcpClient tcpClient = TcpClient.create()
                 .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, 1000)
                 .doOnConnected(connection ->
                         connection.addHandlerLast(new ReadTimeoutHandler(10))
                                   .addHandlerLast(new WriteTimeoutHandler(10)));
WebClient webClient = WebClient.builder()
    .clientConnector(new ReactorClientHttpConnector(HttpClient.from(tcpClient)))
    .build();

Peut-être en ajoutant ce qui suit à votre application.properties fournira plus d'informations sur ce qui se passe au niveau HTTP:

logging.level.reactor.ipc.netty.channel.ContextHandler=debug
logging.level.reactor.ipc.netty.http.client.HttpClient=debug
17
Brian Clozel