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>

person sve    schedule 14.06.2015    source источник
comment
Я не пробовал, но Spring Cloud AWS добавляет абстракцию Resource для S3. Вы можете взглянуть на это: cloud. spring.io/spring-cloud-aws/   -  person Michael Minella    schedule 15.06.2015
comment
Спасибо. Посмотрю. Итак, я могу создать пользовательский считыватель элементов, используя упомянутый ресурс? любые идеи для пакетной обработки?   -  person sve    schedule 16.06.2015
comment
Нет. Я ожидаю, что вы сможете использовать «FlatFileItemReader», но, как я уже сказал, я сам этого не пробовал.   -  person Michael Minella    schedule 17.06.2015
comment
У тебя получилось, пожалуйста, @SpringStarter?   -  person John    schedule 20.07.2015
comment
У меня есть FlatFileItemReader, работающий с Spring Cloud AWS здесь: пакетная обработка закодированного заархивированного файла"> stackoverflow.com/questions/31984393/   -  person Groppe    schedule 21.02.2019


Ответы (3)


Обновление Чтобы использовать Spring-cloud-AWS, вы по-прежнему будете использовать FlatFileItemReader, но теперь вам не нужно создавать собственный расширенный ресурс.

Вместо этого вы настраиваете aws-контекст и передаете ему свой компонент S3Client.

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

Читатель будет настроен так же, как и любой другой читатель - единственное, что здесь уникально, это то, что вы теперь автоматически подключаете свой 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 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();

и последнее модифицированное использование

.getLastModified().getTime();

Созданный вами ресурс будет иметь AmazonS3Client, который содержит всю информацию, необходимую вашему приложению spring-batch для связи с S3. Вот как это может выглядеть с конфигурацией Java.

    reader.setResource(new AmazonS3Resource(amazonS3Client, amazonS3Bucket, inputFile));
person mtoutcalt    schedule 17.07.2015
comment
Альтернативой созданию собственного ресурса является использование Spring Cloud AWS API — cloud.spring.io/spring-cloud-aws/ - person mtoutcalt; 22.07.2015
comment
Это именно то, что я сделал после некоторых r и d. Это полезно и работает как шарм. Основываясь на вашем комментарии по использованию Spring Cloud AWS API, как я могу передать данные, полученные в Linemapper/Tokenizer в Spring Batch? - person sve; 23.07.2015
comment
Не должно быть ничего уникального в чтении данных, которые вы получаете. С aws-context, установленным с помощью s3client, и предоставлением читателю загрузчика ресурсов, ваш читатель будет читать элементы так же, как если бы у вас был локальный файл, который вы читали. - person mtoutcalt; 24.07.2015

Более простые шаги:

  1. Создайте клиентский компонент AWSS3.
  2. Создайте bean-компонент ResourceLoader.
  3. Используйте ResourceLoader для установки ресурсов S3.

Во-первых, вам нужно создать клиент AWSS3 и bean-компонент ResourceLoader в файле конфигурации aws, как показано ниже.

@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 для установки ресурсов 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;
}
person Gaurav Raghav    schedule 19.09.2020

Другой способ чтения из S3 через FlatFileItemReader — установить Resouce как InputStream Resouce, а затем использовать s3client putobject для загрузки потока.

reader.setResource(new InputStreamResouce(inputstream));

Как только поток будет заполнен,

s3client.putObject(bucketname,key,inputstream,metadata);
person bumi25    schedule 12.05.2018