spring中使用retry进行接口重试

spring中使用retry进行接口重试

  • 需求
  • 依赖
  • org.springframework.retry.annotation.Retryable注解详解
  • 方法中使用

需求

由于之前生产系统多服务不定时的重启(服务都是集群,所有生产环境的业务还能正常进行),导致系统中的业务状态同步时出现异常,
各个服务的业务状态不一致,需要后续补偿修复业务状态,所以使用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;
}

你可能感兴趣的:(spring,spring,java,后端)