繁体   English   中英

FlatFileItemWriter 在每个 JobExecution 上写入一个新的(不存在的)文件

[英]FlatFileItemWriter write to a new (non-existent) File on each JobExecution

我目前正在处理 Spring Batch CSV 导出。 使用基于块的读取器、写入器、处理器。 读取和处理工作完美无缺,但 FlatFileItemWriter 总是覆盖输出 CSV 文件。 我希望作业检查文件是否存在(如果存在)增加文件名并写入新文件。

这是我当前的代码:我的 Helper 类,它检查 File 是否存在并返回新的 String 供 Writer 使用。

import java.io.File;

import org.springframework.stereotype.Component;

@Component
public class OrderFileManager {

    private final String orderDesc = "order";
    private final String fileEnding = ".csv";

    public String getEmptyOrderNameString() {

        int fileNumber = 1;
        String answer = orderDesc + fileNumber + fileEnding;

        while (new File(answer).exists()) {
            fileNumber = fileNumber + 1;
            answer = orderDesc + fileNumber + fileEnding;
        }
        return answer;
    }
}

我的 ItemWriter :

    @Bean
    public FlatFileItemWriter<UltravisionOrder> writer(String fileName) {
        FlatFileItemWriter<UltravisionOrder> writer = new FlatFileItemWriter<UltravisionOrder>();  
        writer.setResource(new FileSystemResource(fileName));
        DelimitedLineAggregator<UltravisionOrder> delimitedLineAggregator = new DelimitedLineAggregator<UltravisionOrder>();
        delimitedLineAggregator.setDelimiter(";");
        BeanWrapperFieldExtractor<UltravisionOrder> fieldExtractor = new BeanWrapperFieldExtractor<UltravisionOrder>();
        fieldExtractor.setNames(new String[] { "col1", "col2", "col3", ... });
        delimitedLineAggregator.setFieldExtractor(fieldExtractor);
        writer.setLineAggregator(delimitedLineAggregator);
        return writer;
    }

每次作业执行时,FileWriter 都会写入相同的输出文件。 OrderFileManager 在作业中自动装配。 并且作者接收到 OrderFileManager。 getEmptyOrderNameString() 作为参数。

如果在每次作业运行时都没有重新加载 Spring 应用程序上下文,则文件编写器 bean 将被重新使用,并且将始终写入相同的资源。

您可以做的是通过调用使用 SpEL 表达式生成文件名的方法来设置编写器步骤的范围并配置它:

@Bean
@StepScope
public FlatFileItemWriter<UltravisionOrder> itemWriter(@Value("#{orderFileManager.getEmptyOrderNameString()}") String fileName) {
    // ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM