Arquivamento de arquivos em lote do Spring
Atualmente, estou em processo de aprendizado do lote da primavera e fui desafiado com uma tarefa de arquivamento de arquivos. Basicamente, eu preciso ler arquivos CSV separados e colocá-los em uma nova pasta arquivada com o nome do arquivo original anexado à data atual. O que eu quero saber é como posso obter o nome do arquivo original do multiResourceItemReader, usá-lo no FlatfileItemWriter como o nome do arquivo + data e excluir o arquivo original posteriormente.
Aqui está o meu código atual:
@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();
}
Arquivos CSV para serem lidos e arquivados separadamente
EDIT 1: Obrigado pela resposta @Niraj, implementei o ResourceAware e já consigo o nome do arquivo. Agora, minha nova pergunta é como digo ao meu FlatFileItemWriter para criar e gravar em um novo arquivo cada vez que o recurso é alterado?