要求是读取每个<4GB的文件并将数据推送到其他位置。我通过扩展PathMatchingResourcePatternResolver类编写了我自己的getResources()实现,以便按如下方式填充资源数组:
@Override
public Resource[] getResources(String locationPattern) throws IOException {
Set<Resource> resources = new HashSet<Resource>();
AmazonS3 s3Client = streamingClient.getS3Client();
for (S3ObjectSummary summary : S3Objects.withPrefix(s3Client, this.awsConfiguration.getS3Bucket(),
this.awsConfiguration.getS3BucketKey())) {
S3Object s3object = s3Client.getObject(new GetObjectRequest(this.awsConfiguration.getS3Bucket(), summary.getKey()));
resources.add(new S3Resource(summary.getKey(), s3object.getObjectContent()));
}
return resources.toArray(new Resource[resources.size()]);
}
如您所见,我读取了所有资源并构建了一个Resource数组并将其返回。我认为这是个坏主意,而不是我更喜欢将流传递给somethread并继续提取数据而不是等到资源数组中填充所有资源。
另一个回顾我看到的是,持有S3ObjectStream,它将阻止我的请求池化从S3。
有没有其他方法可以用来构建读者?
下面是数据格式,A1有1k +文件,A2有1k +文件,每个文件大小<1。 4GB。
<bucket>
`--- A1/
`--- file1.txt
`---- file2.txt
`---A2/
`----- file3.txt
...........
任何帮助将不胜感激
答案 0 :(得分:0)
已经有一种方法可以获取S3存储桶中的资源列表。 Spring Cloud AWS提供了一个处理此问题的S3Resource实现,因此您无需读取整个资源即可获取资源列表。我在我的S3JDBC示例中使用它:https://github.com/mminella/s3jdbc