Apache HTTP客户端的自定义重试处理程序?

时间:2017-02-21 21:50:44

标签: jersey jersey-2.0 jersey-client

简短版本: 是否可以在使用时配置自定义重试处理程序 ApacheConnectorProvider + PoolingHttpClientConnectionManager?如果是这样,怎么样?

长版: 我使用的是Jersey 2.25.1,我最近使用默认的HTTP连接机制切换到了Apache PoolingHttpClientConnectionManager,以提高我的自动化测试框架的扩展能力。

它通常可以正常工作,但随着我的扩展,我偶尔会遇到“连接超时”#39;我相信Apache HTTPClient能够接受自定义重试处理程序,但我不知道如何使用Jersey配置自定义处理程序。我在很多搜索尝试中都找不到任何例子。

两年前曾问过类似的问题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显示了在实际的Apache HTTPClient上设置它的一种方法,但是我没有看到在泽西岛做同等对待的方法但是我还在尝试了解如何自定义泽西岛。

我认为通过在ClientConfig实例中执行类似于:

的操作来完成它
cfg.property(ApacheClientProperties.RETRY_HANDLER, new HttpRequestRetryHandler() {

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

但是重试处理程序客户端属性设置不存在。

感谢您的任何指示!

2 个答案:

答案 0 :(得分:0)

版本2.26中引入了对RetryHandlers的支持。请参阅ApacheClientProperties.RETRY_HANDLER here

答案 1 :(得分:0)

我知道这个问题很老了,但是在Apache HttpClient的v 3.x中,您可以在每个请求级别设置重试处理程序(PostMethod,现在是HttpPost),但是现在看来你设置了这个使用新的4.x构建器模式创建HttpClient时。这是一个代码片段,使用池化连接管理器和重试处理程序设置客户端,希望这有助于其他人从v3迁移到v4。

       case R.id.more:
                    PopupMenu popup = new PopupMenu(MainActivity.this, findViewById(R.id.more));
                    MenuInflater inflater = popup.getMenuInflater();
                    inflater.inflate(R.menu.mymenu, popup.getMenu());
                    popup.show();

                    /*Intent itent6=new Intent(MainActivity.this,more.class);
                startActivity(itent6);*/
                    break;