使用 Spring-Retry 指定特定于异常的回退策略
2022-09-04 22:22:21
我正在使用Spring-Retry进行某些数据库操作。在 I 重试三次(这假设导致异常的任何内容,如果它失败三次,则不是暂时性的),在 i 无限期重试(程序不能执行任何操作,而不访问数据库,所以它也可以继续重试,直到用户决定重新启动服务器),在任何其他异常上,我不重试。我使用指数退避策略,基本重试时间为 100 毫秒,最大重试时间为 30,000 毫秒。SQLRecoverableException
SQLTransientException
private static final int MAX_RECOVERABLE_RETRIES = 3;
private static final long INITIAL_INTERVAL = 100;
private static final long MAX_INTERVAL = 30 * 1000;
private static final double MULTIPLIER = 2.0;
public static RetryTemplate databaseTemplate() {
RetryTemplate template = new RetryTemplate();
ExceptionClassifierRetryPolicy retryPolicy = new ExceptionClassifierRetryPolicy();
Map<Class<? extends Throwable>, RetryPolicy> policyMap = new HashMap<>();
NeverRetryPolicy baseException = new NeverRetryPolicy();
SimpleRetryPolicy recoverablePolicy = new SimpleRetryPolicy();
recoverablePolicy.setMaxAttempts(MAX_RECOVERABLE_RETRIES);
AlwaysRetryPolicy transientPolicy = new AlwaysRetryPolicy();
policyMap.put(Exception.class, baseException);
policyMap.put(SQLRecoverableException.class, recoverablePolicy);
policyMap.put(SQLTransientException.class, transientPolicy);
retryPolicy.setPolicyMap(policyMap);
template.setRetryPolicy(retryPolicy);
ExponentialBackOffPolicy backOffPolicy = new ExponentialBackOffPolicy();
backOffPolicy.setInitialInterval(INITIAL_INTERVAL);
backOffPolicy.setMaxInterval(MAX_INTERVAL);
backOffPolicy.setMultiplier(MULTIPLIER);
template.setBackOffPolicy(backOffPolicy);
return template;
}
理想情况下,我想对所有用户使用 100 毫秒的固定退避,并且仅将指数退避策略应用于 。我可以通过嵌套重试来实现这一点,但这将大大增加代码的复杂性 - 鉴于没有其他选择,我宁愿简单地将指数退避应用于两者和异常。SQLRecoverableExceptions
SQLTransientExceptions
SQLRecoverableException
SQLTransientException
有没有办法使用单个重试模板将不同的回退策略应用于不同的异常?