簡版: 當使用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) {
...
}
}
);
但重傳處理器客戶端屬性設置不存在。
感謝您的指點!