java - 使用适用于 S3 下载的 AWS 开发工具包时出现 ConnectionPoolTimeOutException
问题描述
我正在通过完成服务(大小为 20 的固定线程池)获取 S3 对象。
下面是通过 completionService.submit() 触发的代码
private Pair<File, ObjectMetadata> downloadObject() {
GetObjectRequest request = new GetObjectRequest(bucketName, objectKey);
StringBuilder localPathBuilder = new StringBuilder();
localPathBuilder.append(root).append(File.separator).append("input").append(File.separator).append(bucketName)
.append(File.separator).append(objectKey);
//System.out.println("File is being downloaded to : " + localPathBuilder.toString());
File file = new File(localPathBuilder.toString());
ObjectMetadata objectMetadata = s3Client.getObject(request, file);
if(objectMetadata != null) {
objectMetadata.setContentEncoding("gzip");
}
return new Pair<File, ObjectMetadata>(file, objectMetadata);
}
根据文档,下载对象后连接应该已经自动关闭。但是该错误表明连接没有正确关闭。
因此,我确实尝试了这个问题中的建议,并摆弄了套接字超时和最大连接数。
private static final AmazonS3 s3Client = AmazonS3ClientBuilder.standard().withRegion(Regions.US_EAST_1)
.withClientConfiguration(new ClientConfiguration().withMaxConnections(100).withSocketTimeout(1000*1000))
.withForceGlobalBucketAccessEnabled(true).build();
但是,问题仍然存在,我仍然得到一个ConnectionPoolTimeoutException
Caused by: org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.leaseConnection(PoolingHttpClientConnectionManager.java:314)
at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$1.get(PoolingHttpClientConnectionManager.java:280)
at sun.reflect.GeneratedMethodAccessor17.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.amazonaws.http.conn.ClientConnectionRequestFactory$Handler.invoke(ClientConnectionRequestFactory.java:70)
at com.amazonaws.http.conn.$Proxy10.get(Unknown Source)
at org.apache.http.impl.execchain.MainClientExec.execute(MainClientExec.java:190)
at org.apache.http.impl.execchain.ProtocolExec.execute(ProtocolExec.java:186)
at org.apache.http.impl.client.InternalHttpClient.doExecute(InternalHttpClient.java:185)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:83)
at org.apache.http.impl.client.CloseableHttpClient.execute(CloseableHttpClient.java:56)
at com.amazonaws.http.apache.client.impl.SdkHttpClient.execute(SdkHttpClient.java:72)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1330)
at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1145)
... 22 more
解决方案
推荐阅读
- architecture - DDD:聚合根需要来自另一个聚合根的信息
- mysql - 如何按日期比较记录并仅返回符合条件的记录?
- android - android studio 中的“所有 com.android.support 库必须使用完全相同的版本规范”
- python-3.x - 熊猫在索引中旋转多于一列
- xslt - XSLT 获取空的 TAG 名称
- json - 使用python将文本转换为json对象
- android - 创建新项目时在android studio中提供自定义活动名称而不是主要活动
- java - 使用 VisualVM 分析 SpringBoot 应用程序时的 NoClassDefFound
- parsing - [期望脚本解析命令输出]
- javascript - 热键问题,alt+s