2017-02-21 122 views
0

簡版: 當使用ApacheConnectorProvider + PoolingHttpClientConnectionManager時,是否可以配置自定義重試處理程序?如果是這樣,怎麼樣?使用Apache HTTP客戶端自定義重試處理程序?

長的版本: 我使用澤西2.25.1和我最近使用默認的HTTP連接機制到Apache PoolingHttpClientConnectionManager來提高我的自動化測試框架的縮放能力切換。

它通常工作,但隨着我的規模,我偶爾會遇到「連接超時」。我相信Apache HTTPClient能夠接受自定義重試處理程序,但我不知道如何使用Jersey配置自定義處理程序。我在許多搜索嘗試中找不到任何示例。

類似的東西問了2年前Here但沒有答案。

這裏是Jersey客戶端我的初始化代碼:

SSLContext ctx = initSSLTrustFactory(); 

    Registry<ConnectionSocketFactory> registry = RegistryBuilder.<ConnectionSocketFactory>create() 
      .register("http", PlainConnectionSocketFactory.getSocketFactory()) 
      .register("https", new SSLConnectionSocketFactory(ctx, NoopHostnameVerifier.INSTANCE)) 
      .build(); 

    ClientConfig cfg = new ClientConfig(); 

    PoolingHttpClientConnectionManager connMan = new PoolingHttpClientConnectionManager(registry); 
    connMan.setMaxTotal(200); 
    connMan.setDefaultMaxPerRoute(50); 

    if (timeout != -1) { 
     SocketConfig sc = SocketConfig.custom() 
       .setSoTimeout(timeout) 
       .setSoReuseAddress(true) 
       .setTcpNoDelay(true) 
       .setSoReuseAddress(true) 
       .build(); 
     connMan.setDefaultSocketConfig(sc); 
     cfg.property(ApacheClientProperties.REQUEST_CONFIG, RequestConfig 
       .custom() 
       .setConnectTimeout(timeout) 
       .setConnectionRequestTimeout(timeout) 
       .setSocketTimeout(timeout) 
       .build() 
     ); 
    } 
    cfg.property(ApacheClientProperties.CONNECTION_MANAGER, connMan); 

    ApacheConnectorProvider acp = new ApacheConnectorProvider(); 
    cfg.connectorProvider(acp); 

    ClientBuilder builder = JerseyClientBuilder.newBuilder(); 
    client = builder 
      .hostnameVerifier((String hostname, SSLSession session) -> true) 
      .withConfig(cfg) 
      .register(JacksonFeature.class) 
      .register(MultiPartWriter.class) 
      .build(); 

有一個例子HERE顯示設置它實際阿帕奇了HTTPClient的一種方式,但我不明白的方式做相當於澤西島,但我仍然試圖瞭解如何定製澤西島。

我本來以爲通過類似ClientConfig實例做有所作爲:

cfg.property(ApacheClientProperties.RETRY_HANDLER, new HttpRequestRetryHandler() { 

    public boolean retryRequest(
      IOException exception, 
      int executionCount, 
      HttpContext context) { 
     ... 
    } 
    } 
); 

但重傳處理器客戶端屬性設置不存在。

感謝您的指點!

回答

0

在2.26版中引入了對RetryHandlers的支持。見ApacheClientProperties.RETRY_HANDLERhere