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



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

这是我当前的代码: 我的帮助程序类,用于检查文件是否存在并返回供编写器使用的新字符串。

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;
}

每次执行作业时,文件编写器都会写入相同的输出文件。 订单文件管理器在作业中自动连线。编写器收到订单文件管理器。getEmptyOrderNameString(( 作为参数。

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

您可以做的是使编写器步骤限定范围,并通过调用使用 SpEL 表达式生成文件名的方法对其进行配置:

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

最新更新