Spring Batch - 从Aws S3读取文件

时间:2015-06-14 16:53:11

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

3 个答案:

答案 0 :(得分:6)

更新要使用Spring-cloud-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 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));

答案 1 :(得分:1)

更简单的步骤是:

  1. 创建AWSS3客户端bean。
  2. 创建ResourceLoader bean。
  3. 使用ResourceLoader设置S3资源。

首先,您需要像这样在AWS配置文件中创建AWSS3客户端和ResourceLoader bean。

@Configuration
@EnableContextResourceLoader
public class AWSConfiguration {

@Bean
@Primary
public AmazonS3 getAmazonS3Cient() {

    ClientConfiguration config = new ClientConfiguration();
    
    config.setConnectionTimeout(5000 * 10);
    config.setSocketTimeout(5000 * 10);

    return AmazonS3ClientBuilder.standard()
            .withClientConfiguration(config).build();
}


@Bean
@Autowired
public static ResourceLoaderBeanPostProcessor resourceLoaderBeanPostProcessor(
        AmazonS3 amazonS3EncryptionClient) {
    return new ResourceLoaderBeanPostProcessor(amazonS3EncryptionClient);
}

}

然后使用ItemReader中的resourceloader bean设置S3资源。

@Autowired
private ResourceLoader resourceLoader;

@Bean
public FlatFileItemReader<String> fileItemReader() {

FlatFileItemReader<String> reader = new FlatFileItemReader<>();
reader.setLineMapper(new JsonLineMapper()); //Change line mapper as per your need
reader.setResource(resourceLoader.getResource("s3://" + amazonS3Bucket + "/" + file));
return reader;
}

答案 2 :(得分:0)

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

reader.setResource(new InputStreamResouce(inputstream));

填充流后,

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