13

私はあまりにも多くの問題でaws Java APIでしばらく働いていました。現在私はライブラリ1.5.2バージョンを使用しています。S3のオブジェクトを反復するときに "ConnectionPoolTimeoutException"

私は、次のコードを使用してフォルダ内のオブジェクトを反復処理していた場合:

AmazonS3 s3 = new AmazonS3Client(new PropertiesCredentials(MyClass.class.getResourceAsStream("AwsCredentials.properties"))); 

String s3Key = "folder1/folder2"; 


String bucketName = Constantes.S3_BUCKET; 
String key = s3Key +"/input_chopped/"; 

ObjectListing current = s3.listObjects(new ListObjectsRequest() 
     .withBucketName(bucketName) 
     .withPrefix(key)); 

boolean siguiente = true; 

while (siguiente) {  

    siguiente &= current.isTruncated(); 
    contador += current.getObjectSummaries().size(); 

    for (S3ObjectSummary objectSummary : current.getObjectSummaries()) {   
     S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectSummary.getKey())); 
     System.out.println(object.getKey()); 
    } 

    current=s3.listNextBatchOfObjects(current); 

} 

要旨:リンク:https://gist.github.com/fgblanch/6038699 私は次の例外取得しています:

INFO (AmazonHttpClient.java:358) - Unable to execute HTTP request: Timeout waiting for connection from pool 
org.apache.http.conn.ConnectionPoolTimeoutException: Timeout waiting for connection from pool 
    at org.apache.http.impl.conn.PoolingClientConnectionManager.leaseConnection(PoolingClientConnectionManager.java:232) 
    at org.apache.http.impl.conn.PoolingClientConnectionManager$1.getConnection(PoolingClientConnectionManager.java:199) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:456) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:906) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:805) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:784) 
    at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:315) 
    at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:199) 
    at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:2994) 
    at com.amazonaws.services.s3.AmazonS3Client.getObject(AmazonS3Client.java:918) 
    at com.madiva.segmentacion.tests.ListaS3.main(ListaS3.java:177) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120) 
Caught an AmazonClientException, which means the client encountered a serious internal problem while trying to communicate with S3, such as not being able to access the network. 
Error Message: Unable to execute HTTP request: Timeout waiting for connection from pool 

任意のアイデア方法をこのエラーを回避します。オブジェクトの数が多いフォルダでのみ発生します。この場合、内部には463個のファイルがあります。ありがとう

答えて

23

私はS3Objectが各オブジェクトの接続を開くことがわかりました。オブジェクトがガベージコレクトされても解放されないため、プールへの接続を解放するためにobject.close()を実行する必要があります。

ので、修正されたコードは次のようになります。洞察力のための

for (S3ObjectSummary objectSummary : current.getObjectSummaries()) {   
     S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectSummary.getKey()));    
     System.out.println(object.getKey()); 
     object.close(); 
    } 
+1

https://forums.aws.amazon.com/message.jspa?messageID=471149 –

+1

@KevinMeredith awsフォーラムでは私自身の質問でした。 P – Fgblanch

+2

これは大きな助けとなりました:) – ZZzzZZzz

1

HttpResponseHandlerがプールからの接続を閉じているかどうか確認してください。 AmazonHttpClientには、接続を閉じるかどうかを示すパラメータ 'leaveHttpConnectionOpen'があります。

+0

おかげで、私はAWSにライブラリのソースをダウンロードして、それぞれが、それは開いている接続だS3Objectことがわかりました。したがって、その接続を解放するためにobject.close()を実行する必要があります。 – Fgblanch