2015-06-14 136 views
3

阅读文件,我想读从AWS S3文件,并与Spring Batch的处理它:Spring Batch的 - 从AWS S3

可以在春天Itemreader处理这项任务? 如果是这样,我如何凭据传递到S3客户端和配置我的Spring XML来读取一个或多个文件

<bean id="itemReader" class=""org.springframework.batch.item.file.FlatFileItemReader""> 
    <property name="resource" value=""${aws.file.name}"" /> 
    </bean> 
+0

我还没有尝试过,但Spring Cloud AWS为S3增加了'Resource'抽象。你可能想看看:http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_resource_handling –

+0

谢谢。我来看看它。那么,我是否使用上述资源创建自定义项目阅读器?批处理的任何想法? – sve

+0

不,我希望你能够使用'FlatFileItemReader',但正如我所说,我没有尝试过这个。 –

回答

5

更新使用Spring-云AWS你仍然会使用FlatFileItemReader,但现在你不需要制作自定义的扩展资源。

取而代之,您将设置一个aws-context并为其提供您的S3Client bean。

<aws-context:context-resource-loader amazon-s3="amazonS3Client"/> 

读者将设立像任何其他读者 - 这里是唯一的唯一的事情是,你现在会自动装配您的ResourceLoader

@Autowired 
private ResourceLoader resourceLoader; 

然后设置的ResourceLoader:

@Bean 
public FlatFileItemReader<Map<String, Object>> AwsItemReader() { 
    FlatFileItemReader<Map<String, Object>> reader = new FlatFileItemReader<>(); 
    reader.setLineMapper(new JsonLineMapper()); 
    reader.setRecordSeparatorPolicy(new JsonRecordSeparatorPolicy()); 
    reader.setResource(resourceLoader.getResource("s3://" + amazonS3Bucket + "/" + file)); 
    return reader; 
} 

我会使用FlatFileItemReader和需要发生的自定义是让你你有自己的S3资源对象。扩展Spring的AbstractResource创建包含AmazonS3客户端,水桶和文件路径信息等自己的AWS资源..

对于的getInputStream使用Java SDK:

 S3Object object = s3Client.getObject(new GetObjectRequest(bucket, awsFilePath)); 
     return object.getObjectContent(); 

那么对于CONTENTLENGTH -

return s3Client.getObjectMetadata(bucket, awsFilePath).getContentLength(); 

和上次更改使用

.getLastModified().getTime(); 

的资源你make将拥有AmazonS3Client,其中包含您的Spring-batch应用程序需要与S3进行通信的所有信息。以下是Java配置可能的样子。

reader.setResource(new AmazonS3Resource(amazonS3Client, amazonS3Bucket, inputFile)); 
+0

创建自己的资源的另一种方法是使用Spring Cloud AWS API - http://cloud.spring.io/spring-cloud-aws/spring-cloud-aws.html#_resource_handling – mtoutcalt

+0

这正是我所做的在一些r和d之后。这是有益的,像魅力一样工作。根据您对使用Spring云AWS API的评论,我如何将收到的数据传递给Spring批处理中的linemapper/tokenizer? – sve

+0

阅读您收到的数据应该没有什么独特之处。通过使用s3client设置aws-context并为读者提供资源加载器,您的Reader将以与读取本地文件时相同的方式读取这些项目。 – mtoutcalt