Динамически передавать имена файлов в FlatFileItemWriter через поток StepBuilderFactory() при использовании ClassifierCompositeItemProcessor в SpringBatch

Я обрабатываю несколько входных файлов с многоформатными строками, используя ClassifierCompositeItemProcessor. Но при использовании StepBuilderFactoryпоток для записи файлов, я не могу передать Resourceимя файла динамически. Имя файла должно быть соответствующим именем входного файла. Любая помощь приветствуется.

Входной файл 1 (data-111111-12323.txt)

      1#9999999#00001#2#RecordType1
2#00002#June#Statement#2020#9#RecordType2
3#7777777#RecordType3

Входной файл 2 (data-22222-23244.txt)

      1#435435#00002#2#RecordType1
2#345435#July#Statement#2021#9#RecordType2
3#645456#RecordType3

Ожидаемый выходной файл 1 (data-111111-12323.txt)


Ожидаемый выходной файл 2 (data-22222-23244.txt)

      1#9999999#00001#2#RecordType1#mobilenumber1
2#00002#June#Statement#2020#9#RecordType2#mobilenumber2
3#7777777#RecordType3#mobilenumber3

Шаг

              public Step partitionStep() throws Exception {
            ItemReader reader = context.getBean(FlatFileItemReader.class);
            ClassifierCompositeItemWriter writer = context.getBean(ClassifierCompositeItemWriter.class);
            return stepBuilderFactory.get("statementProcessingStep.slave").<String, String>chunk(12).reader(reader).processor(processor()).writer(writer)
                    .stream(recordType0FlatFileItemWriter())
                    .stream(recordType1FlatFileItemWriter())
                    .build();
                }

Процессор

      @Bean
    @StepScope
    public ItemProcessor processor() {
            ClassifierCompositeItemProcessor<? extends RecordType, ? extends RecordType> processor = new ClassifierCompositeItemProcessor<>();
SubclassClassifier classifier = new SubclassClassifier();
        Map typeMap = new HashMap();
        typeMap.put(RecordType0.class, recordType0Processor);
        typeMap.put(RecordType1.class, recordType1Processor);
classifier.setTypeMap(typeMap);
        processor.setClassifier(classifier);
return processor;
}

Писатель

      @Bean
    public FlatFileItemWriter<RecordType1> recordType1FlatFileItemWriter() throws Exception{
        FlatFileItemWriter<RecordType1> writer = new FlatFileItemWriter<>();
        writer.setResource( new FileSystemResource("record1.txt")); //This filename should be dynamic
        writer.setAppendAllowed(true);
        writer.setLineAggregator(new DelimitedLineAggregator<RecordType1>() {{
            setDelimiter("#");
            setFieldExtractor(new BeanWrapperFieldExtractor<RecordType1>() {
                {
                    setNames(new String[] { "RecordType", "ID1", "ID2", "ID3"});
                }
            });
        }});
        return  writer;
    }

1 ответ

Вы можете сделать чтение/запись элемента пошаговой и вводить значения из параметров задания или контекста выполнения шага/задания, используя позднее связывание. Например:

      @StepScope
@Bean
public FlatFileItemReader flatFileItemReader(@Value("#{jobParameters['input.file.name']}") String name) {
   return new FlatFileItemReaderBuilder<Foo>()
        .name("flatFileItemReader")
        .resource(new FileSystemResource(name))
        .build();
}

Дополнительные сведения можно найти в разделе « Поздняя привязка атрибутов задания и шага » справочной документации.

Другие вопросы по тегам