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

标签 java spring csv spring-batch itemwriter

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

这是我当前的代码: 我的 Helper 类,用于检查文件是否存在并返回新的字符串供 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;
    }
}

我的项目作家:

    @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 在作业中 Autowiring 。写入者接收 OrderFileManager。 getEmptyOrderNameString() 作为参数。

最佳答案

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

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

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

关于java - FlatFileItemWriter 在每个 JobExecution 上写入新的(不存在的)文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59107221/

相关文章:

java - Java 中的另一个字符串拆分

java - 如何直接从列表的流 -> 过滤器中收集值?

java - Hibernate 连接两个表并在 spring restful webservice 中生成 json 响应?

c# - 使用 CSVhelper C# 合并具有不同 header 的 CSV 文件

Java 8 - 收集具有 Set<?> 类型的列表属性作为一组值

java - 为什么我的导出按钮不显示我的字段的输出

spring - 找不到 XML 模式命名空间的 Spring NamespaceHandler [http ://www. springframework.org/schema/security]

spring - 在运行时设置多个入站 channel 适配器

Java 扫描器 Csv useDelimiter

python - 如何拆分 CSV 行,以便行 [0] 是名称,任何剩余的项目都是元组?