I've Develop a retry mechanism by taking a reference from the following course. Below is the code I developed in Spring Batch, in this code @Recover
method is not getting called. What am I doing wrong here ?
@EnableRetry
@Configuration
public class RetryConfig {
@Value("${retry.interval.in.seconds}")
private long retryIntervalInSeconds;
@Value("${max.attempts}")
private int attempts;
@Bean
public RetryTemplate mdsRetryTemplate() {
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
retryPolicy.setMaxAttempts(attempts);
FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
backOffPolicy.setBackOffPeriod(1000 * retryIntervalInSeconds);
RetryTemplate template = new RetryTemplate();
template.setRetryPolicy(retryPolicy);
template.setBackOffPolicy(backOffPolicy);
return template;
}
}
Below is the Controller
@RestController
@Slf4j
public class BatchJobController {
@Autowired
private JobLauncher jobLauncher;
@Autowired
@Qualifier(value = "sampleAcctJob")
private Job sampleAcctJob;
@Autowired
private RetryTemplate retryTemplate;
@GetMapping(value = "/invoke-job")
public String handle() throws Throwable {
long diff = 0;
JobExecution je= this.invokeJob();
Date start = je.getCreateTime();
Date end = je.getEndTime();
diff = end.getTime() - start.getTime();
return "All data has been loaded successfully.";
}
private JobExecution invokeJob() throws Throwable {
// PDF Job
JobParameters pdfParams = new JobParametersBuilder()
.addString(".id", String.valueOf(System.currentTimeMillis()))
.addDate("date", new Date()).toJobParameters();
return retryTemplate.execute(retryContext -> {
JobExecution jobExecution = jobLauncher.run(sampleAcctJob, pdfParams);
if(!jobExecution.getAllFailureExceptions().isEmpty()) {
log.error("============== sampleAcctJob Job failed, retrying.... ================");
throw jobExecution.getAllFailureExceptions().iterator().next();
}
logDetails(jobExecution);
return jobExecution;
});
}
private void logDetails(JobExecution jobExecution) {
log.info("JOB_NAME = {}, JOB_STATUS = {}, START_TIME={}, END_TIME = {} ",
jobExecution.getJobInstance().getJobName(),
jobExecution.getStatus(),
jobExecution.getStartTime(),
jobExecution.getEndTime());
}
@Recover
private void recover() {
System.out.println("===============");
}
}
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…