복붙노트

[SPRING] Spring Batch - Aws S3의 파일 읽기

SPRING

Spring Batch - Aws S3의 파일 읽기

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>

해결법

  1. ==============================

    1.업데이트 Spring-cloud-AWS를 사용하려면 여전히 FlatFileItemReader를 사용하지만 사용자 정의 확장 리소스를 만들 필요는 없습니다.

    업데이트 Spring-cloud-AWS를 사용하려면 여전히 FlatFileItemReader를 사용하지만 사용자 정의 확장 리소스를 만들 필요는 없습니다.

    대신 aws-context를 설정하고 S3Client 빈을 제공하십시오.

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

    독자는 다른 독자와 마찬가지로 설정 될 것입니다. 여기서 유일한 것은 ResourceLoader를 autowire하는 것입니다

    @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를 확장하여 AmazonS3 Client, 버킷 및 파일 경로 정보 등을 포함하는 자체 AWS 리소스를 만들 수 있습니다.

    getInputStream의 경우 Java SDK를 사용하십시오.

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

    다음에, contentLength -

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

    및 lastModified 사용

    .getLastModified().getTime();
    

    여러분이 만드는 리소스에는 SpringSoft 앱이 S3와 통신하는 데 필요한 모든 정보가 포함 된 AmazonS3Client가 있습니다. 다음은 Java 구성에서의 모습입니다.

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

    2.FlatFileItemReader를 통해 S3에서 읽는 또 다른 방법은 Resource를 InputStream Resource로 설정 한 다음 s3client putobject를 사용하여 Stream을 업로드하는 것입니다.

    FlatFileItemReader를 통해 S3에서 읽는 또 다른 방법은 Resource를 InputStream Resource로 설정 한 다음 s3client putobject를 사용하여 Stream을 업로드하는 것입니다.

    reader.setResource(new InputStreamResouce(inputstream));
    

    스트림이 채워지면,

    s3client.putObject(bucketname,key,inputstream,metadata);
    
  3. from https://stackoverflow.com/questions/30832041/spring-batch-read-files-from-aws-s3 by cc-by-sa and MIT license