簡體   English   中英

每隔一個使用 Apache HTTPClient 的請求就會失敗

[英]Every second request using Apache HTTPClient fails

我正在嘗試使用 Apache HTTPClient 4.5.1 來做一些休息請求。 不幸的是,每第二個請求都以“java.net.SocketTimeoutException: Read timed out”結束(如果未設置套接字超時,則永遠掛起)。

我正在像這樣構建我的客戶端:

ConnectionSocketFactory sf = new PlainConnectionSocketFactory();

Registry<ConnectionSocketFactory> r = RegistryBuilder.<ConnectionSocketFactory> create()
    .register("http", sf)
    .build();

Lookup<AuthSchemeProvider> authProviders = RegistryBuilder.<AuthSchemeProvider> create()
    .register(AuthSchemes.BASIC, (AuthSchemeProvider) new BasicSchemeFactory())
    .build();

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager(r);

CredentialsProvider cp = new BasicCredentialsProvider();
cp.setCredentials(AuthScope.ANY, new UsernamePasswordCredentials("user", "pass"));

RequestConfig requestConfig = RequestConfig.custom()
    .setConnectTimeout(15000)
    .setConnectionRequestTimeout(15000)
    .setSocketTimeout(15000)
    .build();

this.client = HttpClients.custom()
    .setConnectionManager(cm)
    .setDefaultCredentialsProvider(cp)
    .setDefaultAuthSchemeRegistry(authProviders)
    .setDefaultRequestConfig(requestConfig)
    .build();

之后我做我這樣的請求(在同一個 HttpClient 實例上):

HttpDelete delete = new HttpDelete(uri);

HttpClientContext context = HttpClientContext.create();
CloseableHttpResponse response = this.client.execute(request, context);
try {
    int statusCode = response.getStatusLine().getStatusCode();
    return statusCode;
}
finally {
    response.close();
}

如果我開始為每個請求使用一個新的 HttpClient 實例,一切正常。 在服務器端,我有一個 wildfly 8(還有 9)在運行。 對於第二個請求,我什至看不到請求傳入,因此在我看來,客戶端甚至沒有嘗試。

關於我遺漏/做錯了什么的任何想法?

感謝hotzst提示啟用日志記錄,我想通了:

服務器正在返回 HTTP 狀態 204(無內容),但還是發送了一些響應數據。 HttpClient 將這些響應數據作為 NEXT 請求的“響應中的垃圾”獲取,這通過弄亂響應標頭來破壞它。 將儲備者響應代碼更改為 404 可以解決我的問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM