原文: https://howtodoinjava.com/spring-batch/delete-archive-files-after-read/

在 Spring Batch 作业中,在读取或处理后删除平面文件的最佳方法是创建单独的Tasklet,并在处理结束时在作业结束时执行它。

删除文件的任务

这是此类Tasklet的示例,它将在作业结束时从c:/temp/input/位置删除所有 CSV 文件。

FileDeletingTasklet.java

  1. import java.io.File;
  2. import org.springframework.batch.core.StepContribution;
  3. import org.springframework.batch.core.UnexpectedJobExecutionException;
  4. import org.springframework.batch.core.scope.context.ChunkContext;
  5. import org.springframework.batch.core.step.tasklet.Tasklet;
  6. import org.springframework.batch.repeat.RepeatStatus;
  7. import org.springframework.beans.factory.InitializingBean;
  8. import org.springframework.core.io.Resource;
  9. import org.springframework.util.Assert;
  10. public class FileDeletingTasklet implements Tasklet, InitializingBean {
  11. private Resource[] resources;
  12. public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
  13. for(Resource r: resources) {
  14. File file = r.getFile();
  15. boolean deleted = file.delete();
  16. if (!deleted) {
  17. throw new UnexpectedJobExecutionException("Could not delete file " + file.getPath());
  18. }
  19. }
  20. return RepeatStatus.FINISHED;
  21. }
  22. public void setResources(Resource[] resources) {
  23. this.resources = resources;
  24. }
  25. public void afterPropertiesSet() throws Exception {
  26. Assert.notNull(resources, "directory must be set");
  27. }
  28. }

存档文件

随时修改FileDeletingTasklet中的逻辑以将文件归档到其他位置或实现自己的归档逻辑。

简单的 IO 操作

如何使用FileDeletingTasklet

在主要步骤之后创建另一个要执行的步骤并执行FileDeletingTasklet

BatchConfig.java

  1. import org.springframework.batch.core.Job;
  2. import org.springframework.batch.core.Step;
  3. import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
  4. import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
  5. import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
  6. import org.springframework.batch.core.launch.support.RunIdIncrementer;
  7. import org.springframework.batch.item.file.FlatFileItemReader;
  8. import org.springframework.batch.item.file.MultiResourceItemReader;
  9. import org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper;
  10. import org.springframework.batch.item.file.mapping.DefaultLineMapper;
  11. import org.springframework.batch.item.file.transform.DelimitedLineTokenizer;
  12. import org.springframework.beans.factory.annotation.Autowired;
  13. import org.springframework.beans.factory.annotation.Value;
  14. import org.springframework.context.annotation.Bean;
  15. import org.springframework.context.annotation.Configuration;
  16. import org.springframework.core.io.Resource;
  17. import com.howtodoinjava.demo.model.Employee;
  18. @Configuration
  19. @EnableBatchProcessing
  20. public class BatchConfig
  21. {
  22. @Autowired
  23. private JobBuilderFactory jobBuilderFactory;
  24. @Autowired
  25. private StepBuilderFactory stepBuilderFactory;
  26. @Value("file:c:/temp/input/inputData*.csv")
  27. private Resource[] inputResources;
  28. @Bean
  29. public Job readCSVFilesJob() {
  30. return jobBuilderFactory
  31. .get("readCSVFilesJob")
  32. .incrementer(new RunIdIncrementer())
  33. .start(step1())
  34. .next(step2())
  35. .build();
  36. }
  37. @Bean
  38. public Step step1() {
  39. return stepBuilderFactory.get("step1").<Employee, Employee>chunk(5)
  40. .reader(multiResourceItemReader())
  41. .writer(writer())
  42. .build();
  43. }
  44. @Bean
  45. public Step step2() {
  46. FileDeletingTasklet task = new FileDeletingTasklet();
  47. task.setResources(inputResources);
  48. return stepBuilderFactory.get("step2")
  49. .tasklet(task)
  50. .build();
  51. }
  52. @Bean
  53. public MultiResourceItemReader<Employee> multiResourceItemReader()
  54. {
  55. MultiResourceItemReader<Employee> resourceItemReader = new MultiResourceItemReader<Employee>();
  56. resourceItemReader.setResources(inputResources);
  57. resourceItemReader.setDelegate(reader());
  58. return resourceItemReader;
  59. }
  60. @SuppressWarnings({ "rawtypes", "unchecked" })
  61. @Bean
  62. public FlatFileItemReader<Employee> reader()
  63. {
  64. // Create reader instance
  65. FlatFileItemReader<Employee> reader = new FlatFileItemReader<Employee>();
  66. // Set number of lines to skips. Use it if file has header rows.
  67. reader.setLinesToSkip(1);
  68. // Configure how each line will be parsed and mapped to different values
  69. reader.setLineMapper(new DefaultLineMapper() {
  70. {
  71. // 3 columns in each row
  72. setLineTokenizer(new DelimitedLineTokenizer() {
  73. {
  74. setNames(new String[] { "id", "firstName", "lastName" });
  75. }
  76. });
  77. // Set values in Employee class
  78. setFieldSetMapper(new BeanWrapperFieldSetMapper<Employee>() {
  79. {
  80. setTargetType(Employee.class);
  81. }
  82. });
  83. }
  84. });
  85. return reader;
  86. }
  87. @Bean
  88. public ConsoleItemWriter<Employee> writer()
  89. {
  90. return new ConsoleItemWriter<Employee>();
  91. }
  92. }

现在运行该应用程序并查看日志。

Console

  1. 2018-07-11 12:30:00 INFO - Job: [SimpleJob: [name=readCSVFilesJob]] launched with the following parameters: [{JobID=1531292400004}]
  2. 2018-07-11 12:30:00 INFO - Executing step: [step1]
  3. Employee [id=1, firstName=Lokesh, lastName=Gupta]
  4. Employee [id=2, firstName=Amit, lastName=Mishra]
  5. Employee [id=3, firstName=Pankaj, lastName=Kumar]
  6. Employee [id=4, firstName=David, lastName=Miller]
  7. Employee [id=5, firstName=Ramesh, lastName=Gupta]
  8. Employee [id=6, firstName=Vineet, lastName=Mishra]
  9. Employee [id=7, firstName=Amit, lastName=Kumar]
  10. Employee [id=8, firstName=Dav, lastName=Miller]
  11. Employee [id=9, firstName=Vikas, lastName=Kumar]
  12. Employee [id=10, firstName=Pratek, lastName=Mishra]
  13. Employee [id=11, firstName=Brian, lastName=Kumar]
  14. Employee [id=12, firstName=David, lastName=Cena]
  15. 2018-07-11 12:30:00 INFO - Executing step: [step2]
  16. Deleted file :: c:\temp\input\inputData1.csv
  17. Deleted file :: c:\temp\input\inputData2.csv
  18. Deleted file :: c:\temp\input\inputData3.csv
  19. 2018-07-11 12:30:00 INFO - Job: [SimpleJob: [name=readCSVFilesJob]] completed with the following parameters: [{JobID=1531292400004}] and the following status: [COMPLETED]

将我的问题放在评论部分。

学习愉快!