Hello everyone,

Greetings today!

Let's get started with the Spring batch job listener today.

What exactly is a Spring Batch Job Listener?

  • Job Listener is a method called before the job and after the job based on our implementation.
What is the Use Of a Job Listener?
  • Job listener can be used to configure/pass some files run time to spring batch reader, or notify start/end of batch job to an external system, for example, sending email on starting of batch job execution, sending email on batch job fail, or logging errors when a batch job fails, and so on.
In the spring batch, we can configure job listeners in two ways.
  • Adding a JobExecutionListener and overriding the beforeJob and afterJob methods
package com.order.processor.listener;

import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobExecutionListener;
import org.springframework.stereotype.Component;

@Component
public class OrderJobExecutionListener 
	implements JobExecutionListener {

    @Override
    public void beforeJob(JobExecution jobExecution) {
        System.out.println("Before Job Called....");
    }

    @Override
    public void afterJob(JobExecution jobExecution) {
        System.out.println("After Job Called....");
    }
}
  • Create a class and annotate methods with @BeforeJob and @AfterJob to be called before and after the batch job is executed.
package com.order.processor.listener;

import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.annotation.AfterJob;
import org.springframework.batch.core.annotation.BeforeJob;
import org.springframework.stereotype.Component;

@Component
public class OrderJobExecutionListenerV1 {
    @BeforeJob
    public void beforeJob(JobExecution jobExecution) {
        System.out.println("Before Job Called for V1....");
    }
    @AfterJob
    public void afterJob(JobExecution jobExecution) {
        System.out.println("After Job Called for V2....");
    }
}

As shown below, we can also check the job status using the afterJob method.

@Override
public void afterJob(JobExecution jobExecution) {
   if(ExitStatus.FAILED.getExitCode()
      .equals(jobExecution.getExitStatus().getExitCode())){
            
    jobExecution.getAllFailureExceptions()
     .forEach(throwable -> throwable.printStackTrace());
   }
}

The listener must also be configured in the spring batch configuration class or it will not be called. As shown below, we can do so.

@Bean(name = "processOrderJob")
public Job processOrderJob() {
 return jobBuilderFactory.get("generateReportCard").
  		incrementer(new RunIdIncrementer()).
        start(processOrder()).
  		listener(orderJobExecutionListener).
  		listener(orderJobExecutionListenerV1).
        build();
}

For your convenience, the complete BatchConfig.java code is provided below.
package com.order.processor.config;

@Configuration
public class BatchConfig {

 @Autowired
 private JobBuilderFactory jobBuilderFactory;

 @Autowired
 private StepBuilderFactory stepBuilderFactory;

 @Autowired
 private OrderReader orderReader;

 @Autowired
 private OrderWriter orderWriter;

 @Autowired
 private OrderJobExecutionListener orderJobExecutionListener;

 @Autowired
 private OrderJobExecutionListenerV1 orderJobExecutionListenerV1;

 @Bean(name = "processOrderJob")
 public Job processOrderJob() {
         return jobBuilderFactory
        .get("generateReportCard")
        .incrementer(new RunIdIncrementer())
        .start(processOrder())
        .listener(orderJobExecutionListener)
        .listener(orderJobExecutionListenerV1)
        .build();
 }
    
 @Bean
 public Step processOrder() {
       return stepBuilderFactory.get("processOrder")
       	.<OrderDTO, OrderDTO>chunk(1)
        .reader(orderReader)
        .writer(orderWriter)
        .build();
  }
}

So far, we've seen how to use and configure job listeners - beforeJob and afterJob - in the spring batch with spring boot.
Please leave a comment if you have any questions.

Thanks
Enjoy your learning!

Other reference articles