Spring Batch - 从Aws S3读取文件

sve*_*sve 4 java spring amazon-s3 spring-xd

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

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

<bean id="itemReader" class=""org.springframework.batch.item.file.FlatFileItemReader"">
    <property name="resource" value=""${aws.file.name}"" />
    </bean>
Run Code Online (Sandbox Code Playgroud)

mto*_*alt 6

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

相反,您设置了一个aws-context并将其提供给您的S3Client bean.

    <aws-context:context-resource-loader amazon-s3="amazonS3Client"/>
Run Code Online (Sandbox Code Playgroud)

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

@Autowired
private ResourceLoader resourceLoader;
Run Code Online (Sandbox Code Playgroud)

然后设置该资源加载器:

@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;
}
Run Code Online (Sandbox Code Playgroud)

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

对于getInputStream,请使用Java SDK:

        S3Object object = s3Client.getObject(new GetObjectRequest(bucket, awsFilePath));
        return object.getObjectContent();
Run Code Online (Sandbox Code Playgroud)

然后为contentLength -

return s3Client.getObjectMetadata(bucket, awsFilePath).getContentLength();
Run Code Online (Sandbox Code Playgroud)

和lastModified使用

.getLastModified().getTime();
Run Code Online (Sandbox Code Playgroud)

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

    reader.setResource(new AmazonS3Resource(amazonS3Client, amazonS3Bucket, inputFile));
Run Code Online (Sandbox Code Playgroud)