Spring Batch-使用FlatFileItemWriter API

时间:2018-07-07 21:38:15

标签: spring spring-boot spring-batch

我尝试了此处Spring Batch - create a new file each time instead of overriding it for transferring data from CSV to 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;
    } 

1 个答案:

答案 0 :(得分:0)

  

任何人都可以指导发生什么问题吗?

三件事:

  • 像您一样使用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表达式。