首页 > 解决方案 > 使用适用于 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

标签: javaamazon-web-servicesamazon-s3aws-sdk

解决方案


推荐阅读