spring中使用retry进行接口重试

需求

由于之前生产系统多服务不定时的重启(服务都是集群,所有生产环境的业务还能正常进行),导致系统中的业务状态同步时出现异常,
各个服务的业务状态不一致,需要后续补偿修复业务状态,所以使用spring-retry对报错接口进行重试(不要说这个让服务器不重启就解决,
服务器的操作权限在运维那边,处理了一周也没有解决),请求报错之后自动重试请求。

依赖

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

org.springframework.retry.annotation.Retryable注解详解

/**
 * 需要异常重试的方法使用注解
 */
public @interface Retryable {

	/**
	 * 异常重试次数用完之后,还是失败执行指定的方法
	 * 值:添加@Recover注解的方法名或bean名称
	 */
	String recover() default "";

	/**
	 * 用于异常重试的方法
	 * 值:bean名称
	 */
	String interceptor() default "";

	/**
	 * 指定的异常才重试,默认为空,所有异常都会被重试
	 */
	Class<? extends Throwable>[] value() default {};

	/**
	 * 同value
	 */
	Class<? extends Throwable>[] include() default {};

	/**
	 * 排除指定的异常不重试,默认为空
	 */
	Class<? extends Throwable>[] exclude() default {};

	/**
	 * 重试的标签
	 */
	String label() default "";

	/**
	 * 标识重试是有状态的,博主目前还没了解清除具体怎么使用。
	 */
	boolean stateful() default false;

	/**
	 * 最大重试次数,默认为3
	 */
	int maxAttempts() default 3;

	/**
	 * 获取最大重试次数,可以从配置文件中读取属性
	 * maxAttemptsExpression = "${retry.maxAttempts}"
	 */
	String maxAttemptsExpression() default "";

	/**
	 * 重试等待策略
	 * backoff = @Backoff(delay = 500L, multiplier = 1)
	 * 表示延迟500ms后重试,每次重试时间都在原基础上再加500ms
	 * 具体:第一次:500*1 ms 第二次:500*2 ms 第n次:500*n ms
	 */
	Backoff backoff() default @Backoff();

	/**
	 * 在{@code SimpleRetryPolicy.canRetry()}返回true后指定要评估的表达式-可用于有条件地抑制重试。
	 * 仅在抛出异常后调用。
	 */
	String exceptionExpression() default "";

	/**
	 * 需要重试的监听器Bean名称,而非spring容器默认的bean名称
	 */
	String[] listeners() default {};

}

方法中使用

@Retryable(value = TokenFailureException.class,maxAttempts = 5,backoff = @Backoff(delay = 500L, multiplier = 1))
publicBspcCommonResp importAccount(PsbcImportReq req){
    BspcCommonResp resp = JSONObject.parseObject(sendPostRequest(PsbcUrlConstant.BSPC_IMPORT,req), BspcCommonResp.class);
    if(resp.isTokenException()){
        // token失效,刷新token后重试
        refreshToken();
        throw new TokenFailureException("token失效");
    }
    return resp;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Retry是一个基于AOP实现的机制,用于处理应用程序可能发生的失败情况,比如调用第三方接口失败等。通过延时、间隔递增等方式,Spring Retry可以帮助我们实现自动的功能。 要使用Spring Retry,需要在项目的依赖引入spring-retry库。可以在项目的Maven或Gradle配置文件添加相应的依赖项。例如,在Maven添加以下依赖项: ```xml <dependency> <groupId>org.springframework.retry</groupId> <artifactId>spring-retry</artifactId> <version>1.2.4.RELEASE</version> </dependency> ``` 使用Spring Retry时,可以在需要的方法上使用`@Retryable`注解。同时,在配置类上添加`@EnableRetry`注解来启用声明式功能。例如: ```java @EnableRetry @Configuration public class RetryConfiguration { @Bean public HelloService helloService() { return new HelloService(); } } ``` 通过以上配置,我们可以在`HelloService`的方法上使用`@Retryable`注解来实现自动的功能。 <span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringRetryspring机制)——只需一个注解](https://blog.csdn.net/qq_48607414/article/details/128042278)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [Spring(34)——Spring Retry介绍](https://blog.csdn.net/elim168/article/details/90320848)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值