乐观锁失败或接口调用失败后使用AOP实现重试机制

一、乐观锁失败后会报:ObjectOptimisticLockFailureExceptionjava
二、处理方案:捕获到对应乐观锁失败异常后进行重试

以下使用aop实现一个重试,可用于乐观锁
1、新建一个注解,用于标注需要重试的方法

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface RetryOnOptimisticLockingFailure {
}

2、新建重试的方法并添加注解

public interface UserService {
    int save();
}

@Service
public class UserServiceImpl implements UserService{
    @Override
    @RetryOnFail  //添加重试注解
    public int save() {
        int i = new Random().nextInt(10);
        int i1 = 10 / (i % 3); //除0异常  这里模拟乐观异常
        return i1;
    }
}

3、新建切面类对标注注解的方法进行代理

@Component
@Aspect
public class RetryOnOptimisticLockingFailureAspect {
    //定义最大重试次数
    private final int MAX_RETRY_TIME=5;
    
    //基于注解定义切入点 --这里要写刚刚定义那个注解的全限定名
    @Pointcut("@annotation(com.example.service.RetryOnOptimisticLockingFailure)")
    public void retryOnOptFailure(){}

    //定义通知
    @Around("retryOnOptFailure()")
    public Object doProceed(ProceedingJoinPoint joinPoint) throws Throwable {
        int time=0;
        do {//循环5次
            time++;
            try {
                Object proceed = joinPoint.proceed();
                return proceed;//如果没有异常则正常返回结束循环与方法
            } catch (Exception e) {
                //出异常了,记录log,进入循环
                if(e instanceof ArithmeticException){//修改对应的异常   如:乐观锁OptimisticLockingException
                    System.out.println("retrying....times:"+time);
                }
            }
        } while (time<MAX_RETRY_TIME);
        return null;
    }
}

4、测试

@SpringBootTest
public class MyTest {
    @Autowired
    private UserService userService;

    @Test
    public void save(){
        for (int i = 0; i < 10; i++) {//调用10次  增加触发重试的机率
            System.out.println(userService.save());
        }
    }
}

5、运行结果

在这里插入图片描述

  • 6
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值