我在这里尝试了帖子中应用的解决方案: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("Mddyyyyhhmmss").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 示例中复制
"
在 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 表达式。