WriterNotOpenException при использовании аннотации StepScope в Spring Batch

У меня есть специальный писатель, который хорошо работает; однако я бы хотел установить имя моего выходного файла через JobParameters вместо использования фиксированной строки в моей конфигурации. Для этого я добавил аннотацию и параметры @StepScope, как и со своим ItemReader.

Объявление ItemWriter

@Bean
@StepScope
public ItemWriter<CityProcessed> writer(@Value("#{jobParameters[inputFile]}") String inputFile, @Value("#{jobParameters[outputFile]}") String outputFile) {
    // String inputFile = "D:/cities.csv";
    // String outputFile = "D:/compterendu.csv";
    FlatFileItemWriter<CityCRE> writer = new FlatFileItemWriter<CityCRE>();
    FileSystemResource isr;
    isr = new FileSystemResource(new File(outputFile));
    writer.setResource(isr);
    DelimitedLineAggregator<CityCRE> aggregator = new DelimitedLineAggregator<CityCRE>();
    aggregator.setDelimiter(";");
    BeanWrapperFieldExtractor<CityCRE> beanWrapper = new BeanWrapperFieldExtractor<CityCRE>();
    beanWrapper.setNames(new String[]{
        "nom", "pays", "identifiantBase", "c/m"
    });
    aggregator.setFieldExtractor(beanWrapper);
    writer.setLineAggregator(aggregator);
    CityItemWriter itemWriter = new CityItemWriter();
    writer.setFooterCallback(itemWriter);
    writer.setHeaderCallback(itemWriter);
    itemWriter.setDelegate(writer);
    itemWriter.setInputFileName(inputFile);
    return itemWriter;
}

Объявление шага

@Bean
public Step stepImport(StepBuilderFactory stepBuilderFactory, ItemReader<CityFile> reader, ItemWriter<CityProcessed> writer, ItemProcessor<CityFile, CityProcessed> processor) {
    return stepBuilderFactory
        .get("step1")
        .<CityFile, CityProcessed> chunk(10)
        .reader(reader(null))
        .processor(processor)
        .writer(writer(null, null))
        .build();
}

Этот код не работает, я получаю WriterNotOpenException из-за FlatFileItemWriter, который я использую в качестве делегата.

У меня была такая же ошибка, когда я пытался использовать JobParameters для своего ItemReader, мне пришлось изменить тип возвращаемого значения на «FlatFileItemReader» (вместо ItemReader). Я не могу сделать то же самое здесь, потому что мне нужен мой собственный ItemWriter, а не простой FlatFileItemWriter.

Я не понимаю, почему я получаю эту ошибку, когда добавляю @StepScope, в то время как у моего читателя нет проблем без этого. Что я делаю неправильно ?

Дополнительная информация :

  • Моя конфигурация работала, когда я использовал строки inputFile и outputFile.
  • Похоже, у меня возникает ошибка, когда я добавляю аннотацию @StepScope (даже без добавления JobParameters в качестве параметров записи).

person Carrm    schedule 16.03.2015    source источник


Ответы (2)


Вы должны зарегистрировать автора делегата как поток; таким образом SB будет правильно управлять жизненным циклом потока.

person Luca Basso Ricci    schedule 16.03.2015
comment
Он работает (спасибо), но я до сих пор не понимаю, почему он работает, когда я использую только фиксированные строки без необходимости регистрировать делегат как поток. Есть ли этому объяснение? - person Carrm; 16.03.2015
comment
Я не могу помочь вам в этом, извините :( Я полагаю, что статическая / ограниченная регистрация работает по-другому, но @MMinella может дать вам правильное объяснение. - person Luca Basso Ricci; 16.03.2015

кто реализует CityItemWriter?

попробуйте - измените общедоступный ItemWriter на FlatFileItemWriter

ОШИБКА

public ItemWriter leituraArquivoDelimitadoWriter (@Value (# {jobParameters ['arquivoSaidaClientes']}) Resource arquivoClienteSaida) {// возвращаем элементы - ›items.forEach (System.out :: println);

    return new **FlatFileItemWriterBuilder**<Cliente>()
            .name("leituraArquivoDelimitadoWriter")
            .resource(arquivoClienteSaida)              
            .delimited()
            .names(new String [] {"nome", "sobrenome", "idade", "email"})
            .build();
}

}

ОШИБКА СООБЩЕНИЯ

org.springframework.batch.item.WriterNotOpenException: Writer должен быть открыт, прежде чем его можно будет записать в

ОК

public FlatFileItemWriter leituraArquivoDelimitadoWriter (@Value (# {jobParameters ['arquivoSaidaClientes']}) Resource arquivoClienteSaida) {// возвращаем элементы - ›items.forEach (System.out :: println);

    return new **FlatFileItemWriterBuilder**<Cliente>()
            .name("leituraArquivoDelimitadoWriter")
            .resource(arquivoClienteSaida)              
            .delimited()
            .names(new String [] {"nome", "sobrenome", "idade", "email"})
            .build();
}

}

в этом случае измените общедоступный ItemWriter на FlatFileItemWriter, чтобы решить проблему.

person victor hugo soares lima    schedule 05.12.2020
comment
meta.stackoverflow.com / questions / 300987 / - person GalaxyCat105; 06.12.2020