После того, как вы определили свою работу и как ее выполнить, вы можете использовать Spring Retry , которая обеспечивает ExponentialBackOffPolicy
из коробки.Вот пример:
import java.time.LocalDateTime;
import org.junit.Test;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.retry.RetryCallback;
import org.springframework.retry.RetryContext;
import org.springframework.retry.backoff.ExponentialBackOffPolicy;
import org.springframework.retry.policy.SimpleRetryPolicy;
import org.springframework.retry.support.RetryTemplate;
public class RetryTemplateTest {
private Job job; // under test, has to be initialized
@Test
public void testExponentialBackoff() throws Exception {
// configure backoff policy
ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
exponentialBackOffPolicy.setInitialInterval(1000);
exponentialBackOffPolicy.setMultiplier(2.0);
exponentialBackOffPolicy.setMaxInterval(10000);
// configure retry policy
SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
simpleRetryPolicy.setMaxAttempts(5);
// configure retry template
RetryTemplate retryTemplate = new RetryTemplate();
retryTemplate.setBackOffPolicy(exponentialBackOffPolicy);
retryTemplate.setRetryPolicy(simpleRetryPolicy);
// run the job with retry on failure
retryTemplate.execute(new RetryCallback<JobExecution, Exception>() {
@Override
public JobExecution doWithRetry(RetryContext context) throws Exception {
return run(job);
}
});
}
private JobExecution run(Job job) throws Exception {
System.out.println(LocalDateTime.now() + ": running job");
if (true) { // just for test
throw new Exception("Job failed");
}
return null;
}
}
Этот пример печатает:
2019-03-13T09:19:21.882: running job
2019-03-13T09:19:22.892: running job
2019-03-13T09:19:24.893: running job
2019-03-13T09:19:28.894: running job
2019-03-13T09:19:36.895: running job
java.lang.Exception: Job failed
Как видите, шаблон повтора запустил задание в секундах 21, 22, 24, 28 и 36и повторил задание не более 5 раз, прежде чем потерпел неудачу.
Надеюсь, это поможет.