简版: 当使用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) {
...
}
}
);
但重传处理器客户端属性设置不存在。
感谢您的指点!