原创

Spring-Retryable-重试-Guava-Retry

  启动类加上 @EnableRetry
/**
* 执行失败返回默认值
* throws BizzException,需要和queryUserInfoByUserIdList的异常一样
* 对于@Recover注解的方法,需要特别注意的是:
* 1、方法的返回值必须与@Retryable方法一致
* 2、方法的第一个参数,必须是Throwable类型的,建议是与@Retryable配置的异常一致,其他的参数,需要与@Retryable方法的参数一致
* https://blog.csdn.net/wtopps/article/details/103698635
*/
@Recover
public EduSyncMqPaasUserActionWrapper doQueryUserInfoByUserIdRecover(Throwable e, String containerId, String userId) throws BizzException {
log.error("查询paas全部重试失败,返回空集合,userId:{}", userId);
EduSyncMqPaasUserActionWrapper eduSyncMqPaasUserActionWrapper = new EduSyncMqPaasUserActionWrapper();
eduSyncMqPaasUserActionWrapper.setPaasUser(null);
return eduSyncMqPaasUserActionWrapper;
}
//延迟重试
@Retryable(value = BizzException.class, maxAttempts = 4, backoff = @Backoff(delay = 3000L, multiplier = 2, maxDelay = 50000L))
public synchronized EduSyncMqPaasUserActionWrapper queryUserInfoByUserId(String containerId, String userId) {
List<PaasUserOVo> userOVos = eduTrainUserService.queryUserInfoByUserIdList(Lists.newArrayList(userId),true);
if(...){
throw new BizzException("未查询人员");//关系到paas-server同步及时性问题
}
return ...
}

/**
* 0毫秒立即重试3次
* 一共4次
*
* @return
*/
// 立即重试
@Retryable(value = BizzException.class, maxAttempts = 3, backoff = @Backoff(delay = 0L, multiplier = 1, maxDelay = 0))
public Object getUserInfoFromOpenApiWithRetry(String accessToken, boolean isReadFromRedis) {
log.info("开始请求用户信息:accessToken={}", accessToken);
Object obj = getUserInfo(accessToken, isReadFromRedis);
if (obj != null) {
log.info("getUserInfo获取用户信息成功,userId={}",
JSON.parseObject(JSON.toJSONString(obj)).get("user_id"));
}

return obj;
}


缺点:
一个是重试实体限定为 Throwable 子类,说明重试针对的是可捕捉的功能异常为设计前提的,但是我们希望依赖某个数据对象实体作为重试实体,
但 sping-retry框架必须强制转换为Throwable子类。
另一个就是重试根源的断言对象使用的是 doWithRetry 的 Exception 异常实例,不符合正常内部断言的返回设计。
Spring Retry 提倡以注解的方式对方法进行重试,重试逻辑是同步执行的,重试的"失败"针对的是Throwable,
如果你要以返回值的某个状态来判定是否需要重试,可能只能通过自己判断返回值然后显式抛出异常了。
@Recover 注解在使用时无法指定方法,如果一个类中多个重试方法,就会很麻烦。

另外 Guava-Retry
https://zhuanlan.zhihu.com/p/149119179
https://mp.weixin.qq.com/s/EQk5wCf_P_VrkbVntVGNjA

正文到此结束
本文目录