使用Spring Retry实现业务异常重试

 更新时间:2024年01月03日 09:29:24   作者:程序无涯海  
在系统中经常遇到业务重试的逻辑,比如三方接口调用,timeout重试三遍,异常处理重试的兜底逻辑等,本文给大家介绍一下如何使用Spring Retry优雅的实现业务异常重试,需要的朋友可以参考下

在系统中经常遇到业务重试的逻辑,比如三方接口调用,timeout重试三遍,异常处理重试的兜底逻辑等。那你是不是还在用下面这种方式呢:

我想大家可能很多时候也会这么写,这是能想到的第一个方法,但是我们这段代码,会觉得很别扭,不够优雅,如果有多个重试的逻辑,就会显得重复代码太多,也不容易理解,总之在遇到Spring Retry之前我也一直在想有没有更好的方法去解决这种问题。下面我们来看看Spring Retry如何实现的。

项目配置

添加依赖

    <dependencies>
        <dependency>
            <groupId>org.springframework.retry</groupId>
            <artifactId>spring-retry</artifactId>
            <version>1.3.1</version>
        </dependency>
    </dependencies>

启用Spring Retry支持,添加**@EnableRetry**注解

@SpringBootApplication
@EnableRetry
public class Launcher {
    public static void main(String[] args) {
        SpringApplication.run(Launcher.class, args);
    }
}

@Retryable 注解形式

注解方式就是在启用重试特性的方法上使用@Retryable注释。

public interface RetryService {
    /**
     * 指定异常CustomRetryException重试,重试最大次数为4(默认是3),重试补偿机制间隔200毫秒
     * 还可以配置exclude,指定异常不充实,默认为空
     * @return result
     * @throws CustomRetryException 指定异常
     */
    @Retryable(value = {CustomRetryException.class},maxAttempts = 4,backoff = @Backoff(200))
    String retry() throws CustomRetryException;
}
  • value属性告诉 Spring retry 在方法在CustomRetryException异常出现时触发重试。
  • maxAttempts设置重试的最大次数,如果没有指定默认值为3。
  • backoff指定下次重试的延迟时间,默认值为1秒。

@Recover注解使用

当被@Retryable注解的方法由于指定的异常而失败时,用于定义单独恢复方法的@Recover注释。

@Service
@Slf4j
public class RetryServiceImpl implements RetryService {
​
    private static int count = 1;
​
    @Override
    public String retry() throws CustomRetryException {
        log.info("retry{},throw CustomRetryException in method retry",count);
        count ++;
        throw new CustomRetryException("throw custom exception");
    }
​
    @Recover
    public String recover(Throwable throwable) {
        log.info("Default Retry service test");
        return "Error Class :: " + throwable.getClass().getName();
    }
​
}

RetryTemplate实现形式

@Bean
    @ConditionalOnMissingBean
    public RetryTemplate retryTemplate(){
        final SimpleRetryPolicy simpleRetryPolicy = new SimpleRetryPolicy();
        simpleRetryPolicy.setMaxAttempts(4);
​
        final FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
        fixedBackOffPolicy.setBackOffPeriod(1000L);
​
        return RetryTemplate.builder()
            .customPolicy(simpleRetryPolicy)
            .customBackoff(fixedBackOffPolicy)
            .retryOn(CustomRetryException.class)
            .build();
    }

// 执行部分
@Autowired
RetryTemplate retryTemplate;

template.execute(ctx -> {
    return backendAdapter.getBackendResponse(...);
});

总结

那么哪些地方我们能用到Spring Retry呢?有这两点建议

  • 仅在临时错误上使用重试。不建议它在永久错误中使用它,因为这样可能导致系统性能问题。
  • 它不是熔断器的替代的一种方式,最好在允许的情况下,既使用熔断器,又使用重试器。

到此这篇关于使用Spring Retry实现业务异常重试的文章就介绍到这了,更多相关Spring Retry业务异常重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java如何使用itext向PDF插入数据和图片

    Java如何使用itext向PDF插入数据和图片

    最近项目中使用到Java实现写入PDF文件,这篇文章主要给大家介绍了关于Java如何使用itext向PDF插入数据和图片的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-01-01
  • springboot如何初始化执行sql语句

    springboot如何初始化执行sql语句

    这篇文章主要介绍了springboot初始化执行sql语句的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Java方法重载实现原理及代码实例

    Java方法重载实现原理及代码实例

    这篇文章主要介绍了Java方法重载实现原理及代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • Java连接数据库,及增删改查的示例

    Java连接数据库,及增删改查的示例

    这篇文章主要介绍了Java连接数据库,及增删改查的示例,帮助大家更好的利用Java处理数据,感兴趣的朋友可以了解下
    2020-10-10
  • 浅析Java NIO 直接缓冲区和非直接缓冲区

    浅析Java NIO 直接缓冲区和非直接缓冲区

    本篇文章主要为大家介绍了Java NIO 中直接缓冲区和非直接缓冲区的定义以及使用流程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-11-11
  • 浅谈hibernate中懒加载禁用操作

    浅谈hibernate中懒加载禁用操作

    这篇文章主要介绍了浅谈hibernate中懒加载禁用操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-10-10
  • ssm项目session使用及其作用域问题

    ssm项目session使用及其作用域问题

    这篇文章主要介绍了ssm项目session使用及其作用域问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-03-03
  • Java中如何检查数组是否包含某整数

    Java中如何检查数组是否包含某整数

    这篇文章主要介绍了在 Java 中检查数组是否包含某整数,在本文中,我们使用了几个内置的方法,如anyMatch()、contains()、binarySearch()等,我们将在给定的数组中找到一个值,结合示例代码给大家介绍的非常详细,需要的朋友可以参考下
    2023-05-05
  • IDEA新建springboot项目时未生成pom.xml文件的解决操作

    IDEA新建springboot项目时未生成pom.xml文件的解决操作

    这篇文章主要给大家介绍了关于IDEA新建springboot项目时未生成pom.xml文件的解决操作方法,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • 解决Springboot-application.properties中文乱码问题

    解决Springboot-application.properties中文乱码问题

    这篇文章主要介绍了解决Springboot-application.properties中文乱码问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11

最新评论