1

这让我很头疼,所以我想我会发布简单的解决方案。我的问题是,在为 Amazon 的 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 个对象的所有内容,然后超时。

4

3 回答 3

2

无论出于何种原因,主要问题是我已将 s3 声明为AmazonS3Client s3. 它应该看起来像:

AmazonS3 s3 = new AmazonS3Client(propertiesFile);

以防万一其他人遇到这个问题。

于 2012-06-14T15:05:44.867 回答
0

希望虽然您可以调用 getObject 来下载它,但您并没有关闭 InputStream。这是通过调用 getObject() 来选择的;处理完每个对象后,您必须关闭 InputStream。

阅读更多详细信息:http ://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3Client.html#getObject(com.amazonaws.services.s3.model.GetObjectRequest )

谢谢

于 2012-06-20T05:55:43.377 回答
0

对于 Scala 开发人员,这里是使用官方AWS SDK for Java执行 AmazonS3 存储桶内容的完整扫描和映射的递归函数

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

要调用上述 curriedmap()函数,只需在第一个参数列表中传递已构建(并正确初始化)的 AmazonS3Client 对象(请参阅官方AWS SDK for Java API 参考)、存储桶名称和前缀名称。还传递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处理的那样与许多其他函数结合使用

于 2014-06-05T12:33:50.900 回答