当前位置: 首页 > 知识库问答 >
问题:

在spring批处理中使用StepScope注释时的WriterNotOpenException

燕智
2023-03-14

我有一个定制的作家,它很好用;但是,我想通过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作为委托。

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

我不明白为什么当我添加@stepscope时会出现这个错误,而我的阅读器没有它就没有问题。我做错了什么?

其他信息:

  • 我的配置在使用inputFile和outputFile字符串时起作用。
  • 添加@stepscope批注(即使没有添加JobParameters作为writer参数)时似乎出错。

共有1个答案

慕容文昌
2023-03-14

您必须将委托writer注册为Stream;这样,SB将以正确的方式管理流生命周期。

 类似资料:
  • 我正在使用Spring Batch Admin从我的主项目的批处理模块中启动批处理。 在Spring batch Admin项目的依赖项中,将批处理模块编译为JAR addedstrong文本,如下所示: 因为我在一个reader类上添加了“@stepscope”,所以在部署Spring Batch Admin时,我会遇到以下错误 但是我没有找到如何使用类似的声明来防止Spring Batch A

  • 主要内容:使用Rem语句注释,注释使用::声明为创建的脚本添加注释或文档总是一个好习惯。 这是一个维护脚本用来理解脚本实际所做的事情所必需的注释。 例如,考虑下面这段没有注释形式的代码。 如果一个没有任何注释的脚本,普通人试图理解脚本,那么需要很多时间来理解脚本做些什么工作。 使用Rem语句注释 有两种方法可以在批处理脚本中创建注释; 一个是通过命令。 语句后的任何文本都将被视为注释,不会被执行。 以下是此声明的一般语法。 语法 其中是需要添

  • 我正在使用Spring Boot+Spring Batch(注释),遇到了一个我必须运行2个作业的场景。 我有员工和工资记录,需要使用spring批处理更新。我已经按照本教程spring-batch入门教程为Employee和Salary对象配置了

  • 我有一个批处理文件,它运行几个python脚本来修改表。 > 我还想添加注释,特别提醒他们在运行批处理文件之前需要在批处理文件中更新的变量。我知道我可以使用。但这看起来更像是为了在用户运行之后更新进度。 是否有更恰当地添加注释的语法?

  • 我的处理器中有一个简单的注释,如下所示: 这适用于java文件,但一旦我将文件转换为kotlin,注释的导入就不再有效。为什么? 我需要改变什么才能让他的注释也在Kotlin中工作?从文档中,我可以看到kotlin与java注释100%兼容,所以我有点困惑这里有什么问题...如果处理器不工作,需要调整以与kotlin一起工作,我会理解,但我不知道为什么导入本身不工作... 我说的图书馆在这里:ht