Spring Batch – 从Aws S3读取文件

我正在尝试从AWS S3读取文件并使用Spring Batch处理它:

Spring Itemreader可以处理此任务吗? 如果是这样,我如何将凭据传递给S3客户端并配置我的spring xml以读取文件或多个文件

   

更新要使用Spring-cloud-AWS,您仍然可以使用FlatFileItemReader,但现在您不需要创建自定义扩展资源。

相反,你设置一个aws-context并给它你的S3Client bean。

   

读者可以像任何其他读者一样进行设置 – 这里独一无二的是你现在可以自动装载你的ResourceLoader

 @Autowired private ResourceLoader resourceLoader; 

然后设置该resourceloader:

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

我会使用FlatFileItemReader,需要进行的自定义就是创建自己的S3 Resource对象。 扩展Spring的AbstractResource以创建您自己的AWS资源,其中包含AmazonS3客户端,存储桶和文件路径信息等。

对于getInputStream,请使用Java SDK:

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

然后为contentLength –

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

和lastModified使用

 .getLastModified().getTime(); 

您创建的资源将包含AmazonS3Client,其中包含您的spring-batch应用程序与S3通信所需的所有信息。 这是Java配置的样子。

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

从S3读取FlatFileItemReader的另一种方法是将Resouce设置为InputStream Resouce,然后使用s3client putobject上传Stream。

 reader.setResource(new InputStreamResouce(inputstream)); 

填充流后,

 s3client.putObject(bucketname,key,inputstream,metadata);