Trimax
Trimax

Reputation: 2473

store filenames in Spring Batch for send email

I’m writing an application in Spring Batch to do this:

  1. Read the content of a folder, file by file.
  2. Rename the files and move them to several folders.
  3. Send two emails: one with successed name files processed and one with name files that throwed errors.

I’ve already get 1. and 2. but I need to make the 3 point. ¿How can I store the file names that have send to the writer method in an elegant way with Spring Batch?

Upvotes: 0

Views: 214

Answers (1)

Vignesh T I
Vignesh T I

Reputation: 872

You can use a Execution Context to store the values of file names which gets processed and also which fails with errors.

We shall have a List/ similar datastructure which has the file names after the business logic. Below is a small snippet for reference which implements StepExecutionListener,

public class FileProcessor implements ItemWriter<TestData>, StepExecutionListener {

   private List<String> success = new ArrayList<>();
   private List<String> failed = new ArrayList<>();

   @Override
   public void beforeStep(StepExecution stepExecution) {

   }

   @Override
   public void write(List<? extends BatchTenantBackupData> items) throws Exception {
       // Business logic which adds the success and failure file names to the list 
          after processing
   }

   @Override
   public ExitStatus afterStep(StepExecution stepExecution) {     
       stepExecution.getJobExecution().getExecutionContext()
                         .put("fileProcessedSuccessfully", success);

       stepExecution.getJobExecution().getExecutionContext()
                         .put("fileProcessedFailure", failed);

       return ExitStatus.COMPLETED;
   }
}

Now we have stored the file names in the execution context which we will be able to use it in send email step.

public class sendReport implements Tasklet, StepExecutionListener {

   private List<String> success = new ArrayList<>();
   private List<String> failed = new ArrayList<>();

   @Override
   public void beforeStep(StepExecution stepExecution) {

    try {

        // Fetch the list of file names which we have stored in the context from previous step

        success = (List<String>) stepExecution.getJobExecution().getExecutionContext()
                .get("fileProcessedSuccessfully");

        failed = (List<BatchJobReportContent>) stepExecution.getJobExecution()
                .getExecutionContext().get("fileProcessedFailure"); 

       } catch (Exception e) {
       }
   }

   @Override
   public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {

    // Business logic to send email with the file names
   }

   @Override
   public ExitStatus afterStep(StepExecution stepExecution) {
       logger.debug("Email Trigger step completed successfully!");
       return ExitStatus.COMPLETED;
   }
}

Upvotes: 1

Related Questions