【问题标题】:Spring batch doesn't seem to be closing item writers properlySpring Batch 似乎没有正确关闭项目编写器
【发布时间】:2022-02-23 12:40:28
【问题描述】:

我的工作是将每个项目写入一个单独的文件中。为此,作业使用 ClassifierCompositeItemWriter,其 ClassifierCompositeItemWriter 为每个项目返回一个新的 FlatFileItemWriter(代码如下)。

    @Bean
    @StepScope
    public ClassifierCompositeItemWriter<ProcessorResult> writer(@Value("#{jobParameters['outputPath']}") String outputPath) {

        ClassifierCompositeItemWriter<MyItem> compositeItemWriter = new ClassifierCompositeItemWriter<>();
        
        compositeItemWriter.setClassifier((item) -> {
            
            String filePath = outputPath + "/" + item.getFileName();
            
            BeanWrapperFieldExtractor<MyItem> fieldExtractor = new BeanWrapperFieldExtractor<>();
            fieldExtractor.setNames(new String[]{"content"});
            
            DelimitedLineAggregator<MyItem> lineAggregator = new DelimitedLineAggregator<>();
            lineAggregator.setFieldExtractor(fieldExtractor);

            FlatFileItemWriter<MyItem> itemWriter = new FlatFileItemWriter<>();
            itemWriter.setResource(new FileSystemResource(filePath));
            itemWriter.setLineAggregator(lineAggregator);
            itemWriter.setShouldDeleteIfEmpty(true);
            itemWriter.setShouldDeleteIfExists(true);

            itemWriter.open(new ExecutionContext());
            return itemWriter;
            
        });
        
        return compositeItemWriter;

    }

以下是作业的配置方式:

    @Bean
    public Step step1() {
        return stepBuilderFactory
                .get("step1")
                .<String, MyItem>chunk(1)
                .reader(reader(null))
                .processor(processor(null, null, null))
                .writer(writer(null))
                .build();
    }

    @Bean
    public Job job() {
        return jobBuilderFactory
                .get("job")
                .incrementer(new RunIdIncrementer())
                .flow(step1())
                .end()
                .build();
    }

一切都很完美。所有文件都按我的预期生成。但是,无法删除其中一个文件。只有一个。如果我尝试删除它,我会收到一条消息说“OpenJDK Platform binary”正在使用它。如果我将块增加到大于我正在生成的文件数量的大小,则无法删除任何文件。似乎删除最后一个块中生成的文件存在问题,例如相应的编写器没有被 Spring Batch 生命周期或其他东西正确关闭。

如果我终止应用程序进程,我可以删除文件。

我知道为什么会发生这种情况吗?提前致谢!

PS:我称之为“itemWriter.open(new ExecutionContext());”因为如果我不这样做,我会得到一个“org.springframework.batch.item.WriterNotOpenException: Writer must be open before it can be write to”。

编辑:

如果有人遇到类似问题,我建议阅读 Mahmoud 对此问题的回答 Spring batch : ClassifierCompositeItemWriter footer not getting called

【问题讨论】:

    标签: java spring spring-batch


    【解决方案1】:

    执行此操作时,您可能在步骤范围之外使用了 itemwriter:

     itemWriter.open(new ExecutionContext());
    

    请查看this question,希望对您有所帮助。

    【讨论】:

    • 非常感谢您的回答。我认为问题正是如此。您提供的此链接与其他链接stackoverflow.com/questions/67604628/… 一起帮助解决了我的问题。关键点似乎是在步骤中将编写器注册为流的要求,以便正确调用打开/更新/关闭。我想我不能选择这个作为答案或支持它,因为我没有足够的声誉。
    • 另外, engraçado que eu venho em site gringo pedir ajuda, e recebo ajuda de outro brasileiro kkkkkk
    • 当你有足够的声望,请回来做。哈哈! Tamo junto irmão.
    猜你喜欢
    • 2016-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-06
    • 2012-04-18
    相关资源
    最近更新 更多