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



简短版本:使用时是否可以配置自定义重试处理程序ApacheconnectorProvider poolinghttpclientConnectionManager?如果是这样,如何?

长版:我正在使用泽西岛2.25.1,最近我从使用默认的HTTP连接机制转换为Apache PoolingHttpClientConnectionManager来提高我的自动测试框架的缩放能力。

它通常在起作用,但是随着我的扩展,我会偶尔会获得"连接超时"。我相信Apache HTTPClient具有接受自定义重试处理程序的能力,但我不知道如何使用Jersey配置自定义处理程序。我在许多搜索尝试中都找不到任何示例。

2年前在这里问了类似的事情,但没有答案。

这是我针对球衣客户的初始化代码:

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

这里有一个示例显示在实际的Apache HTTPClient上设置它的一种方法,但是我看不到在泽西岛进行等效的方法,但我仍在尝试了解如何自定义球衣。p>我会认为通过在clientconfig实例中做某事类似:

cfg.property(ApacheClientProperties.RETRY_HANDLER, new HttpRequestRetryHandler() {
    public boolean retryRequest(
            IOException exception,
            int executionCount,
            HttpContext context) {
         ...
    }
  }
);

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

感谢任何指示!

在版本2.26中引入了对重试者的支持。请参阅此处的ApacheClientProperties.RETRY_HANDLER

我知道这个问题很旧,但是在apache httpclient的v 3.x中,您将能够将重试处理程序设置为每个要求级别(postmethod,现在是httppost)但是,现在看来,当您使用新的4.X构建器模式创建HTTPCLEINT时,您可以将其设置为。这是一个代码片段,设置了使用合并连接管理器和重试处理程序设置客户端,希望这可以帮助其他人必须从v3迁移到V4。

public class HttpClientFactory {
  private static final int MAX_TOTAL_CONNECTIONS = 60;
  public static final int REMOTE_SEARCH_TIMEOUT_DEFAULT = 180000;
  private int connectionTimeout = REMOTE_SEARCH_TIMEOUT_DEFAULT;
  private int maxTotalConnections = MAX_TOTAL_CONNECTIONS;
  private final SomeCustomRetryHandler somecustomretryhandler = new SomeCustomRetryHandler();
  public HttpClient createHttpClient() {
    RequestConfig config = RequestConfig.custom()
            .setConnectTimeout(3000)
            .setConnectionRequestTimeout(3000)
            .setSocketTimeout(3000)
            .build();
    return HttpClients.custom()
            .setConnectionManager(createPoolingHttpConnectionManager())
            .setDefaultRequestConfig(config)
            .setRetryHandler(somecustomretryhandler)
            .build();
  }
  private PoolingHttpClientConnectionManager createPoolingHttpConnectionManager() {
    PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
    cm.setDefaultMaxPerRoute(getMaxTotalConnections(6);
    cm.setMaxTotal(6);
    return cm;
  }
}

最新更新