2015-03-16 2 views
0

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

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, в то время как у моего читателя нет проблем без него. Что я делаю не так ?

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

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

ответ

0

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

+0

Он работает (спасибо), но я до сих пор не понимаю, почему он работает, когда я использую только фиксированные строки без необходимости регистрации делегата в качестве потока. Есть ли объяснение этому? – Carrm

+0

Я не могу вам помочь, извините :(Я полагаю, что регистрация в статическом/ограниченном регистре работает по-другому, но @MMinella может дать вам правильное объяснение. –

Смежные вопросы