2017-09-15 30 views
5

我想設置超時我的WebClient超時,這裏是當前的代碼:春天5 webflux如何設置Web客戶端

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(); 

我需要添加超時,也合併策略,我想類似的東西:

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(); 

但我想不出如何設置的HttpClient在我的WebClient

回答

5

的WebFlux WebClient不使用Apache的百科全書HTTP客戶端。儘管您可能可以通過自定義ClientHttpConnector實施一個解決方案。現有的ReactorClientHttpConnector基於Netty。因此,考慮使用Netty的選項來配置客戶端,如:

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

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

UPDATE

我們也可以使用ReadTimeoutHandler

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

這似乎是我尋找,只是一個簡單的問題是,連接超時或請求超時。任何想法如何設置連接池大小?感謝您的幫助 – Seb

+2

'reactor.ipc.netty.options.ClientOptions.Builder'中有'poolResources()''requestTimeout'確實等於'ChannelOption.SO_TIMEOUT'。 'connectTimeoutMillis'肯定是關於連接的。 –

+0

是的,我看到poolResources(),我不得不承認我不知道如何使用它:/任何想法? – Seb

0

這裏的我是怎麼做到的(感謝@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

要設置讀取和連接超時我使用下面的方法,因爲SO_TIMEOUT選項不適用於使用NIO(並給予警告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

我會試試看,謝謝分享 – Seb

+0

Upvoted。這應該是正確的答案。 c.f. https://stackoverflow.com/a/22897119/839733 –