使用Spring-Retry指定特定于异常的退避策略

Zim-Zam O'Pootertoot:

我正在使用Spring-Retry进行一些数据库操作。在一次SQLRecoverableExceptionI重试3次(假设它导致失败的原因是,如果导致失败的原因是三次,则导致该异常是非暂时性的),一次SQLTransientExceptionI重试(该程序在不访问数据库的情况下无法执行任何操作)继续重试,直到用户决定重新引导服务器为止),并且在其他任何例外情况下,我都不会重试。我使用指数退避策略,其基本重试时间为100ms,最大重试时间为30,000ms。

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;
}

理想情况下,我想对所有人都使用100ms的固定补偿SQLRecoverableExceptions,并且仅将指数补偿策略应用于SQLTransientExceptions我可以使用嵌套重试来完成此操作,但这将大大增加代码的复杂性-鉴于没有其他选择,我希望仅将指数退避同时应用于异常SQLRecoverableExceptionSQLTransientException异常。

我是否可以使用一个重试模板将不同的退避策略应用于不同的例外?

oailloud:

确实,ExceptionClassifierRetryPolicy是要走的路。我没有设法使其与policyMap虽然。

这是我的用法:

@Component("yourRetryPolicy")
public class YourRetryPolicy extends ExceptionClassifierRetryPolicy
{
    @PostConstruct
    public void init()
    {
        final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
        simpleRetryPolicy.setMaxAttempts( 3 );

        this.setExceptionClassifier( new Classifier<Throwable, RetryPolicy>()
        {
            @Override
            public RetryPolicy classify( Throwable classifiable )
            {
                    if ( classifiable instanceof YourException )
                    {
                            return new NeverRetryPolicy();
                    }
                    // etc...
                    return simpleRetryPolicy;
            }
        });
    }
}

然后,您只需要在重试模板上进行设置即可:

@Autowired
@Qualifier("yourRetryPolicy")
private YourRetryPolicy yourRetryPolicy;

//...

RetryTemplate retryTemplate = new RetryTemplate();
retryTemplate.setRetryPolicy( yourRetryPolicy );

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Spring Retry-异常问题和重试

Java,特定于类的异常与标准异常

使用Spring本地化异常消息

是否可以基于HttpStatus代码自定义重试模板使用的退避策略

使用Spring RetryTemplate时获取当前的退避值

如何使用Spring Boot安全性保护特定于用户的资源?

使用Spring Retry,是否可以将退避值作为函数参数传递?

使用Spring Retry顽强的StaleObjectStateException问题

使用Spring Data MongoDB指定分片集合

使用Spring Data JPA捕获SQL异常

使用特定于片段的“ adjustPan”或“ adjustResize”

使用spring-kafka具有消息顺序保证的指数退避

使用Spring Boot在resilience4j-retry中达到最大尝试次数后处理异常

如何使用特定于环境的配置创建Spring Cloud Config Client?

使用熊猫输入特定于类型的输出

如何使用Spring Retry在用尽的重试中包装异常

使用模板参数指定策略

使用平台时,指定特定于Python版本的testenv设置

Akka Streams:如何仅在失败的情况下使用退避策略?

使用Spring注入EntityManager(空指针异常)

使用Spring的cut ehcache逐出策略

使用Sidekiq和纯Ruby指定特定于环境的配置

在Spring选择中的何处使用'in'而不是'='的异常

如何使用1.0.3版本的Spring Retry启用Spring retry?

Spring Boot,特定于环境的属性位置

我可以使用C#BerConverter.Encode()指定应用程序或特定于上下文的标记吗?

使用JSP进行Spring Boot,获取异常

使用 Spring MVC 评估 SpringEL 的异常

如何在 python 请求中使用非指数退避策略进行重试?