2012-06-14 41 views
1

這給了我一個很大的頭疼,所以我想我會發布簡單的解決方案。 我的問題是,當使用亞馬遜S3的Java API時,我只能下載50個對象,然後纔會神祕地超時。該代碼看起來是這樣的:亞馬遜S3僅Java API下載50個對象

int counter = 0; 
AmazonS3Client s3 = new AmazonS3Client(propertiesFile); 
while(objectList.isTruncated()){ 
for(S3ObjectSummary objectSummary : objectList.getObjectSummaries()){ 
    System.out.println(++counter); 
    S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectSummary.getKey())); 
//do stuff 
} 
} 

它會運行和處理一切罰款整整50對象,然後超時。

回答

2

無論出於何種原因,主要問題是我宣佈s3爲AmazonS3Client s3。它應該看起來像:

AmazonS3 s3 = new AmazonS3Client(propertiesFile); 

只是爲了防止其他人遇到這個問題。

0

對於斯卡拉開發人員,在這裏它是執行全掃描和使用官方地圖的AmazonS3桶的內容遞歸函數AWS SDK for Java

import com.amazonaws.services.s3.AmazonS3Client 
import com.amazonaws.services.s3.model.{S3ObjectSummary, ObjectListing, GetObjectRequest} 
import scala.collection.JavaConversions.{collectionAsScalaIterable => asScala} 

def map[T](s3: AmazonS3Client, bucket: String, prefix: String)(f: (S3ObjectSummary) => T) = { 

    def scan(acc:List[T], listing:ObjectListing): List[T] = { 
    val summaries = asScala[S3ObjectSummary](listing.getObjectSummaries()) 
    val mapped = (for (summary <- summaries) yield f(summary)).toList 

    if (!listing.isTruncated) mapped.toList 
    else scan(acc ::: mapped, s3.listNextBatchOfObjects(listing)) 
    } 

    scan(List(), s3.listObjects(bucket, prefix)) 
} 

要調用上述咖喱map()功能只需將已構建的(並正確初始化的)AmazonS3Client對象(請參閱官方AWS SDK for Java API Reference),存儲桶名稱和前綴名稱傳遞給第一個參數列表。還要通過您想要應用的功能f()來映射第二個參數列表中的每個對象摘要。

例如

val tuple = map(s3, bucket, prefix)(s => (s.getKey, s.getOwner, s.getSize)) 

將返回該桶/前綴(key, owner, size)元組的完整列表

val totalSize = map(s3, "bucket", "prefix")(s => s.getSize).sum 

將返回其內容的總大小(注意附加sum()摺疊功能應用在表達式的末尾;-)

您可以將map()與許多其他功能結合使用,正如您通常通過Monads in Functional Programming