Spring Batch - 在使用 FlatFileItemWriter API 写入数据时创建新的唯一 CSV 名称



我在这里尝试了帖子中应用的解决方案:Spring Batch - 每次创建一个新文件,而不是覆盖它以将数据从 CSV 传输到 XML,但它不适用于我使用的基于注释的方法。

fileItemWriter.setResource(new FileSystemResource("csv/employees-#{new java.text.SimpleDateFormat("Mddyyyyhhmmss").format(new java.util.GregorianCalendar().getTime())}.csv"));

我的批处理作业计划每 1 小时运行一次,此批处理作业读取表并将数据写入 CSV 文件。当数据写入时,我需要完全创建新文件。如果文件名是唯一的,那就太好了,所以我正在寻找根据帖子实现日期等。

谁能指导发生了什么问题?

@Bean(destroyMethod="")
public FlatFileItemWriter<Employees> employeesWriter(){
FlatFileItemWriter<Employees> fileItemWriter = new FlatFileItemWriter<>();
//fileItemWriter.setResource(new FileSystemResource("csv/employees.csv"));
fileItemWriter.setResource(new FileSystemResource("csv/employees-#{new java.text.SimpleDateFormat(&quot;Mddyyyyhhmmss&quot;).format(new java.util.GregorianCalendar().getTime())}.csv"));
fileItemWriter.setHeaderCallback(headerCallback());
BeanWrapperFieldExtractor<Employees> fieldExtractor = new BeanWrapperFieldExtractor<>();
fieldExtractor.setNames(new String[] {"employeeNumber", "lastName", "firstName", "extension", "email", "officeCode", "reportsTo", "jobTitle"});
DelimitedLineAggregator<Employees> lineAggregator = new DelimitedLineAggregator<>();
lineAggregator.setDelimiter(",");
lineAggregator.setFieldExtractor(fieldExtractor);
fileItemWriter.setLineAggregator(lineAggregator);
fileItemWriter.setShouldDeleteIfEmpty(true);
return fileItemWriter;
} 

谁能指导发生了什么问题?

三件事:

  • SpEL 表达式在使用时不会被解释
  • 从 xml 示例中复制&quot;在 Java 配置中不起作用
  • csv/...中的/不是文件名中的有效字符

您需要按如下方式声明您的编写器:

@Bean
public FlatFileItemWriter itemWriter(@Value("employees-#{new java.text.SimpleDateFormat('Mddyyyyhhmmss').format(new java.util.GregorianCalendar().getTime())}.csv") String filename) {
FlatFileItemWriter<Employees> fileItemWriter = new FlatFileItemWriter<>();
fileItemWriter.setResource(new FileSystemResource(filename));
...
return fileItemWriter;
}

但我建议使用步骤范围的项编写器并将文件名作为作业参数传递,而不是使用 SpEL 表达式。

最新更新