简短版本:使用时是否可以配置自定义重试处理程序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;
}
}