2017-02-21 10 views
0

Краткая версия: Возможно ли настроить пользовательский обработчик повтора при использовании ApacheConnectorProvider + PoolingHttpClientConnectionManager? Если да, то как?Пользовательский обработчик повтора с HTTP-клиентом Apache?

Long Version: Я использую Джерси 2.25.1 и я недавно перешел от использования механизма подключения к HTTP по умолчанию для Apache PoolingHttpClientConnectionManager для улучшения масштабирования способности моей автоматизированной испытательной базы.

Обычно это работает, но по мере того, как я масштабируюсь, я получаю случайный «тайм-аут соединения». Я считаю, что HTTP-клиент Apache имеет возможность принимать пользовательский обработчик повтора, но я не знаю, как настроить пользовательский обработчик с помощью Джерси. Я не могу найти примеров во многих попытках поиска.

Нечто похоже было было задано 2 года назад Here, но ответа не получено.

Вот мой код инициализации для клиента Джерси:

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) { 
     ... 
    } 
    } 
); 

Но установка клиента свойство обработчика повторных попыток не существует.

Спасибо за любые указатели!

ответ

0

Поддержка RetryHandlers была представлена ​​в версии 2.26. См. ApacheClientProperties.RETRY_HANDLERhere.

Смежные вопросы