2017-02-21 91 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