【发布时间】:2017-11-06 05:06:07
【问题描述】:
现在正在处理我们上传图片服务的异常,如下场景:
我们有一个网页,来自世界各地的用户可以将他们的图片上传到我们的服务器,图片通常保持在 3MB 左右。现在我们举办了促销活动,上传到我们服务器的图片数量非常庞大,导致服务器抛出异常“org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool”。
我们使用apache httpclient作为核心上传中间件,它的版本是4.5.*,我们使用in this article提到的方法正确处理了响应。 如下代码:
if (returnType != StorageHttpResponse.class && response != null) {
EntityUtils.consumeQuietly(response.getEntity());
httpRequest.abort();
}
此外,该服务的最大连接池为 128,最大连接超时为 50000 毫秒。我们使用流模式上传图片,而不是直接上传图片文件。
所以在这里,我通过在 finally 代码块中使用它来正确处理响应实体,但我仍然无法停止服务抛出连接池超时异常。
我需要添加到我的服务中的任何其他内容吗?我真的使用 redis 对用户的上传请求和帖子处理进行排队吗?
完整代码在这里:
public <T> T excute(Request request, Class<T> returnType) {
Preconditions.checkState(!isShutDown, "JSSHttpClient is destory!");
HttpRequestBase httpRequest = new HttpRequestBuild(this.credential).build(request);
HttpResponse response = null;
try {
response = this.client.execute(httpRequest);
if (errorHandler.hasError(request, response)) {
int statusCode = response.getStatusLine().getStatusCode();
log.warn("Unexpected response," + request + " http code [" + statusCode + "]");
errorHandler.handleError(response);
}
if (returnType != null && returnType != StorageHttpResponse.class) {
return JsonMessageConverter.read(returnType, response);
}
if (returnType == StorageHttpResponse.class) {
return (T) new StorageHttpResponse(response);
}
} catch (IOException e) {
Throwables.propagate(e);
} finally {
if (returnType != StorageHttpResponse.class && response != null) {
EntityUtils.consumeQuietly(response.getEntity());
httpRequest.abort();
}
}
return null;
}
【问题讨论】:
-
我建议在 IOException 捕获块中添加
httpRequest.releaseConnection()。
标签: httpclient