S3

2013-07-22 34 views
13

'da nesneler yinelendiğinde "ConnectionPoolTimeoutException", bir süredir çok fazla sorunla birlikte aws java API ile çalışıyorum. Şu anda kütüphane 1.5.2 sürümünü kullanıyorum.S3

Aşağıdaki kod ile bir klasörün içindeki nesneleri yineleme ettiğimde:

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); 

} 

Gist: Bağlantı: https://gist.github.com/fgblanch/6038699 aşağıdaki özel durum alıyorum:

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 

herhangi bir fikir nasıl Bu hatayı önlemek için. Sadece birkaç nesne içeren klasörlerde olur, bu durumda içeride 463 dosya vardı. Teşekkürler

cevap

23

S3Object öğesinin her nesne için bir bağlantı açtığını buldum. Nesne çöp toplanmış olsa bile bu özgürleştirilmez, bu nedenle havuza bağlantıyı serbest bırakmak için object.close() öğesini çalıştırmak gerekir.

Yani düzeltilmiş kod şöyle olacaktır: içgörü için

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 forumlarında kendi sorumuydu; P – Fgblanch

+2

Bu harika bir yardımcı oldu :) – ZZzzZZzz

1

HttpResponseHandler'in havuzdan bağlantıları kapatıp kapatmadığını kontrol edin. AmazonHttpClient, bağlantının kapatılmasının gerekip gerekmediğini belirten 'leaveHttpConnectionOpen' parametresine sahiptir.

+0

sayesinde ben aws kütüphane kaynakları indirilen ve her bir açık bağlantı var S3Object olduğunu gördük. Bu nedenle, bu bağlantıyı serbest bırakmak için object.close() öğesini çalıştırmak için gerekli olan – Fgblanch