2017-09-15 5 views
5

Je suis en train de régler le délai sur mon WebClient, voici le code actuel:Spring 5 webflux comment définir un délai d'attente sur Webclient

SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build(); 

ClientHttpConnector httpConnector = new ReactorClientHttpConnector(opt -> { 
    opt.sslContext(sslContext); 
    HttpClientOptions option = HttpClientOptions.builder().build(); 
    opt.from(option); 
}); 
return WebClient.builder().clientConnector(httpConnector).defaultHeader("Authorization", xxxx) 
       .baseUrl(this.opusConfig.getBaseURL()).build(); 

Je dois ajouter délai d'attente et également la stratégie mise en commun, je pensais de quelque chose comme ça:

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(); 
cm.setMaxTotal(this.applicationConfig.getHttpClientMaxPoolSize()); 
cm.setDefaultMaxPerRoute(this.applicationConfig.getHttpClientMaxPoolSize()); 
cm.closeIdleConnections(this.applicationConfig.getServerIdleTimeout(), TimeUnit.MILLISECONDS); 

RequestConfig requestConfig = RequestConfig.custom().setSocketTimeout(this.applicationConfig.getHttpClientSocketTimeout()) 
     .setConnectTimeout(this.applicationConfig.getHttpClientConnectTimeout()) 
     .setConnectionRequestTimeout(this.applicationConfig.getHttpClientRequestTimeout()).build(); 

CloseableHttpClient httpClient = HttpClients.custom().setDefaultRequestConfig(requestConfig).setConnectionManager(cm).build(); 

Mais je ne peux pas comprendre comment régler le httpClient dans mon webclient

Répondre

5

le WebFlux WebClient n'utilise pas Apache Commons client HTTP. Bien que vous puissiez être en mesure d'implémenter une solution via ClientHttpConnector personnalisé. Le ReactorClientHttpConnector existant est basé sur le Netty. Alors, pensez à utiliser des options Netty pour configurer le client, par exemple:

ReactorClientHttpConnector connector = 
      new ReactorClientHttpConnector(options -> 
        options.option(ChannelOption.SO_TIMEOUT, this.applicationConfig.getHttpClientConnectTimeout())); 

ou

.onChannelInit(channel -> channel.config().setConnectTimeoutMillis(this.applicationConfig.getHttpClientConnectTimeout())) 

MISE À JOUR

Nous pouvons également utiliser ReadTimeoutHandler:

.onChannelInit(channel -> 
     channel.pipeline() 
      .addLast(new ReadTimeoutHandler(this.applicationConfig.getHttpClientConnectTimeout()))) 
+0

Cela semble être ce que je Je cherche, juste une question rapide est que le délai de connexion ou le délai d'attente de demande. Une idée de comment je pourrais configurer la taille du pool de connexion? merci pour votre aide – Seb

+2

Il y a 'poolResources()' dans le 'reactor.ipc.netty.options.ClientOptions.Builder' Le' requestTimeout' est en effet égal à 'ChannelOption.SO_TIMEOUT'. Le 'connectTimeoutMillis' est définitivement une question de connexion. –

+0

Oui, j'ai vu le poolResources(), je dois admettre que je n'ai aucune idée de comment l'utiliser:/aucune idée? – Seb

0

Voilà comment je l'ai fait (merci à @Artem)

SslContext sslContext = SslContextBuilder.forClient().trustManager(InsecureTrustManagerFactory.INSTANCE).build(); 

     ClientHttpConnector httpConnector = new ReactorClientHttpConnector(options -> { 
      options.sslContext(sslContext); 
      options.option(ChannelOption.SO_TIMEOUT, this.applicationConfig.getHttpClientRequestTimeout()); 
      options.option(ChannelOption.CONNECT_TIMEOUT_MILLIS, this.applicationConfig.getHttpClientConnectTimeout()); 
      options.poolResources(PoolResources.fixed("myPool", this.applicationConfig.getHttpClientMaxPoolSize())); 
     }); 

     return WebClient.builder().clientConnector(httpConnector).defaultHeader("Authorization", "xxxx") 
       .baseUrl(this.config.getBaseURL()).build(); 
4

Pour définir la lecture et connecter temporisation j'utilise la méthode ci-dessous, parce que l'option SO_TIMEOUT n'est pas disponible pour les chaînes en utilisant NIO (et donnant l'avertissement 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(); 
+0

Je vais essayer, merci de partager – Seb

+0

Upvoted. Cela devrait être la bonne réponse. c.f. https://stackoverflow.com/a/22897119/839733 –