在Spring Batch中使用StepScope批注时,WriterNotOpenException

时间:2015-03-16 11:16:16

标签: parameters spring-batch writer

我有一个效果很好的自定义作家;但是,我想通过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();
}

这段代码不起作用,因为我用作委托的FlatFileItemWriter,我得到一个WriterNotOpenException。

当我尝试将JobParame用于我的ItemReader时,我遇到了同样的错误,我不得不将返回类型更改为“FlatFileItemReader”(而不是ItemReader)。我不能在这里做同样的事情因为我需要自定义ItemWriter而不是简单的FlatFileItemWriter。

我不明白为什么在添加@StepScope时出现此错误,而没有它我的阅读器没有问题。我做错了什么?

其他信息:

  • 当我使用inputFile和outputFile字符串时,我的配置工作正常。
  • 当我添加@StepScope注释时(即使没有添加JobParameters作为我的编写器参数),我看起来有错误。

2 个答案:

答案 0 :(得分:0)

您必须将委托编写者注册为流;通过这种方式,SB将以正确的方式管理流生命周期。

答案 1 :(得分:0)

谁是CityItemWriter的实现者?

尝试-将公共ItemWriter更改为FlatFileItemWriter

错误

公共 ItemWriter leituraArquivoDelimitadoWriter(@Value(“#{jobParameters ['arquivoSaidaClientes']}”)资源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,然后才能将其写入

确定

公共 FlatFileItemWriter leituraArquivoDelimitadoWriter(@Value(“#{jobParameters ['arquivoSaidaClientes']}”)资源arquivoClienteSaida){ //返回项目-> items.forEach(System.out :: println);

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

}

在这种情况下,将public ItemWriter 更改为FlatFileItemWriter即可解决问题。