2015-06-14 137 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