java - Spring Batch - 从 Aws S3 读取文件

标签 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>

最佳答案

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

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

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

阅读器将像任何其他阅读器一样设置 - 这里唯一的独特之处在于您现在可以 Autowiring 您的 ResourceLoader

@Autowired
private 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 以创建您自己的 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));

关于java - Spring Batch - 从 Aws S3 读取文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30832041/

相关文章:

java - 这是做我正在尝试的事情的正确方法吗?抽象静态变量?

java - 表格:select unable to retrieve data from database

amazon-web-services - aws ec2 import-image 失败并出现错误 "ClientError: Unknown OS/Missing OS files."

ruby-on-rails - Rails s3 上的回形针 ruby​​ to_file 方法

java - Spring Cloud 2020.0 不再处理 bootstrap.yml 配置

hadoop - YARN 如何决定创建多少个容器? (为什么S3a和HDFS有区别?)

java - Jenkins Build on Sonar Analysis 的错误 projectKey

java - For 循环导致 Scanner 读取另一行

java - CSVParser [Apache] - 为什么它总是忽略第一行(JAVA)

java - 为什么@transactional注解不建议与select操作一起使用