Java Spring批处理文件归档

Java Spring批处理文件归档,java,spring,spring-batch,Java,Spring,Spring Batch,我目前正在学习SpringBatch,我面临着文件归档的挑战。基本上,我需要读取单独的CSV文件,并将它们放在一个新的存档文件夹中,原始文件名随附当前日期。我想知道的是如何从multiResourceItemReader获取原始文件名,在FlatfileItemWriter中将其用作文件名+日期,然后删除原始文件 以下是我当前的代码: @Autowired public JobBuilderFactory jobBuilderFactory; @Autowired public StepBui

我目前正在学习SpringBatch,我面临着文件归档的挑战。基本上,我需要读取单独的CSV文件,并将它们放在一个新的存档文件夹中,原始文件名随附当前日期。我想知道的是如何从multiResourceItemReader获取原始文件名,在FlatfileItemWriter中将其用作文件名+日期,然后删除原始文件

以下是我当前的代码:

@Autowired
public JobBuilderFactory jobBuilderFactory;

@Autowired
public StepBuilderFactory stepBuilderFactory;

@Value("classpath*:/data/CSV_FOR_ARCHIVING*.csv")
private Resource inputFiles[];

@Bean
public MultiResourceItemReader<Person> multiResourceItemReader() {
    MultiResourceItemReader<Person> itemReader = new MultiResourceItemReader<>();

    itemReader.setDelegate(personItemReader());
    itemReader.setResources(inputFiles);

    return itemReader;
}

@Bean
public FlatFileItemReader<Person> personItemReader() {
    FlatFileItemReader<Person> itemReader = new FlatFileItemReader<>();

    itemReader.setLinesToSkip(1);

    DefaultLineMapper<Person> personLineMapper = new DefaultLineMapper<>();

    DelimitedLineTokenizer tokenizer = new DelimitedLineTokenizer();
    tokenizer.setNames(new String[] { "id", "firstName", "lastName", "email", "gender" });

    personLineMapper.setLineTokenizer(tokenizer);
    personLineMapper.setFieldSetMapper(new PersonFieldSetMapper());
    personLineMapper.afterPropertiesSet();

    itemReader.setLineMapper(personLineMapper);

    return itemReader;
}

@Bean
public FlatFileItemWriter<Person> jsonWriter() throws Exception {
    FlatFileItemWriter<Person> personWriter = new FlatFileItemWriter<>();

    personWriter.setLineAggregator(new PersonLineAggregator());
    File outputPath = File.createTempFile("PersonOutput", ".csv", new File("C:/Users/default/Documents"));
    System.out.println("Output Path: " + outputPath.getAbsolutePath());

    personWriter.setResource(new FileSystemResource(outputPath));
    personWriter.afterPropertiesSet();

    return personWriter;
}

@Bean
public Step step1() throws Exception {
    return stepBuilderFactory.get("step1").<Person, Person>chunk(10)
            .listener(new ItemReaderListener())
            .reader(multiResourceItemReader())
            .writer(jsonWriter())
            .build();
}

@Bean
public Job job() throws Exception {
    return jobBuilderFactory.get("job")
            .start(step1())
            .build();
}
@Autowired
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@值(“classpath*:/data/CSV\u用于归档*.CSV”)
私有资源输入文件[];
@豆子
公共MultiResourceItemReader MultiResourceItemReader(){
MultiResourceItemReader itemReader=新的MultiResourceItemReader();
setDelegate(personimReader());
setResources(输入文件);
返回项目阅读器;
}
@豆子
公共FlatFileItemReader PersonitReader(){
FlatFileItemReader itemReader=新FlatFileItemReader();
itemReader.setLinesToSkip(1);
DefaultLineMapper personLineMapper=新的DefaultLineMapper();
DelimitedLineTokenizer标记器=新DelimitedLineTokenizer();
setNames(新字符串[]{“id”、“firstName”、“lastName”、“email”、“gender”});
personLineMapper.setLineTokenizer(标记器);
setFieldSetMapper(新的PersonFieldSetMapper());
personLineMapper.AfterPropertieSet();
setLineMapper(personLineMapper);
返回项目阅读器;
}
@豆子
公共FlatFileItemWriter jsonWriter()引发异常{
FlatFileItemWriter personWriter=新FlatFileItemWriter();
setLineAggregator(新的PersonLineAggregator());
File outputPath=File.createTempFile(“PersonOutput”,“.csv”,新文件(“C:/Users/default/Documents”);
System.out.println(“输出路径:+outputPath.getAbsolutePath());
setResource(新文件系统资源(outputPath));
personWriter.AfterPropertieSet();
回归写手;
}
@豆子
公共步骤step1()引发异常{
返回stepBuilderFactory.get(“step1”).chunk(10)
.listener(新的ItemReaderListener())
.reader(multiResourceItemReader())
.writer(jsonWriter())
.build();
}
@豆子
公共作业Job()引发异常{
返回jobBuilderFactory.get(“作业”)
.start(步骤1())
.build();
}

编辑1:
谢谢@Niraj的回答,我已经实现了ResourceAware,我已经可以得到文件名了。现在我的新问题是,每次资源发生更改时,如何告诉FlatFileItemWriter创建并写入新文件

您可以将读卡器中的值放入executionContext,然后在编写器中读取。像这样的

  @Value("#{jobExecution.executionContext}")
  private ExecutionContext executionContext;

  public void somePlaceInYourReader(){
      this.executionContext.putInt("fileName", fileName);
  }

并使用
executionContext.getInt(“文件名”)
以同样的方式读取它。您可能还必须使用此接口

使用ResourceAware接口获取当前文件名。和ResourceSuffixCreator接口,根据需要创建后缀


可能重复感谢您的回答我已经执行了此操作,现在我有一个新问题。我希望flatfileitemwriter使用此“资源”作为输出文件的文件名。另外,如何使flatfileitemwriter在每次更改资源文件名时都写入新的输出文件?为了每次都有新的输出文件,需要将chunkSize设置为1