SpringBoot整合Spring Retry优雅实现接口重试的示例代码

 更新时间:2026年07月30日 08:36:11   作者:张老师技术栈  
接口调用失败时直接返回错误不是最佳选择,有些场景重试一下就成功了,本文详细介绍Spring Retry的声明式重试机制,包括引入依赖、开启重试、使用@Retryable、自定义重试策略、编程式重试与配置,需要的朋友可以参考下

接口调用失败时,直接返回错误不是最佳选择,有些场景重试一下就成功了。Spring Retry 提供了声明式重试机制。

一、引入依赖

<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
</dependency>
<dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
</dependency>

二、开启重试

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

三、使用 @Retryable

@Service
public class PaymentService {

    private static final Logger log = LoggerFactory.getLogger(PaymentService.class);

    @Retryable(
        value = {RemoteAccessException.class, TimeoutException.class},
        maxAttempts = 3,
        backoff = @Backoff(delay = 1000, multiplier = 2)
    )
    public boolean refund(String orderNo) {
        log.info("退款请求: {}", orderNo);
        // 调用第三方支付接口
        return thirdPartyRefund(orderNo);
    }

    @Recover
    public boolean recover(RemoteAccessException e, String orderNo) {
        log.error("退款失败,记录到异常表: {}", orderNo, e);
        // 记录到失败表,人工处理
        return false;
    }
}

四、自定义重试策略

@Configuration
public class RetryConfig {

    @Bean
    public RetryTemplate retryTemplate() {
        RetryTemplate template = new RetryTemplate();

        // 重试策略:最多重试5次,间隔递增
        ExponentialBackOffPolicy backOff = new ExponentialBackOffPolicy();
        backOff.setInitialInterval(1000);
        backOff.setMultiplier(2);
        backOff.setMaxInterval(10000);
        template.setBackOffPolicy(backOff);

        // 异常判断:哪些异常需要重试
        SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy();
        retryPolicy.setMaxAttempts(5);
        template.setRetryPolicy(retryPolicy);

        return template;
    }
}

五、编程式重试

@Service
public class OrderService {

    @Autowired
    private RetryTemplate retryTemplate;

    public boolean processOrder(Long orderId) {
        return retryTemplate.execute(context -> {
            log.info("处理订单,第{}次尝试", context.getRetryCount() + 1);
            return doProcess(orderId);
        }, context -> {
            log.error("最终失败", context.getLastThrowable());
            return false;
        });
    }
}

六、重试配置

spring:
  retry:
    max-attempts: 3    # 全局最大重试次数

七、秒杀系统应用

@Service
public class SeckillService {

    @Retryable(
        value = OptimisticLockException.class,
        maxAttempts = 3,
        backoff = @Backoff(delay = 200)
    )
    public boolean deductStock(Long productId) {
        // 乐观锁失败时自动重试
        return productMapper.updateStock(productId) > 0;
    }
}

到此这篇关于SpringBoot整合Spring Retry优雅实现接口重试的示例代码的文章就介绍到这了,更多相关SpringBoot Spring Retry接口重试内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java中 Map<String,Object>用法(示例代码整合)

    java中 Map<String,Object>用法(示例代码整合)

    Java中Map<String, Object>是参数化接口,用于存储键值对(键为String,值为Object),适用于动态数据存储、配置信息及JSON处理,需注意类型转换和空指针异常,下面通过示例代码给大家介绍java中 Map<String,Object>用法,感兴趣的朋友一起看看吧
    2025-07-07
  • springboot集成redis存对象乱码的问题及解决

    springboot集成redis存对象乱码的问题及解决

    这篇文章主要介绍了springboot集成redis存对象乱码的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Java实现本地缓存的常用方案介绍

    Java实现本地缓存的常用方案介绍

    本地缓存的代表技术主要有HashMap,Guava Cache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方法,有需要的可以了解下
    2025-05-05
  • springboot如何读取自定义properties并注入到bean中

    springboot如何读取自定义properties并注入到bean中

    这篇文章主要介绍了springboot读取自定义properties并注入到bean中,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 查看和确认Lombok生成代码的四种方法

    查看和确认Lombok生成代码的四种方法

    Lombok是一个Java库,用于减少Java中的样板代码(boilerplate code),由于 Lombok 是在编译阶段自动生成 getter、setter 等方法,所以在源代码(.java文件)中你是看不到这些方法的具体实现的,所以本文给大家介绍了查看和确认Lombok生成代码的四种方法
    2025-09-09
  • java两种单例模式用法分析

    java两种单例模式用法分析

    这篇文章主要介绍了java两种单例模式用法,结合实例形式对比分析了java实现单例模式的两种常见技巧,需要的朋友可以参考下
    2016-08-08
  • SpringBoot整合阿里云OSS对象存储服务实现文件上传

    SpringBoot整合阿里云OSS对象存储服务实现文件上传

    这篇文章主要介绍了SpringBoot整合阿里云OSS对象存储实现文件上传,帮助大家更好的理解和学习使用SpringBoot,感兴趣的朋友可以了解下
    2021-04-04
  • SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

    SpringBoot整合Mybatis,解决TypeAliases配置失败的问题

    这篇文章主要介绍了SpringBoot整合Mybatis,解决TypeAliases配置失败的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07
  • SpringBoot如何解析应用参数args

    SpringBoot如何解析应用参数args

    文章主要介绍了SpringBoot启动过程中如何解析`main`函数中的参数`args`,包括如何解析命令行参数、访问选项参数和非选项参数,接着,介绍了`ApplicationArguments`接口及其方法,感兴趣的朋友跟随小编一起看看吧
    2024-11-11
  • Java Swing实现自定义可搜索下拉框(附完整代码)

    Java Swing实现自定义可搜索下拉框(附完整代码)

    Swing 原生的 JComboBox 虽然支持下拉选择,但有明显的缺点,本文将通过Java Swing实现自定义可搜索下拉框CusComboBox,有需要的小伙伴可以了解下
    2026-06-06

最新评论