千锋教育-做有情怀、有良心、有品质的职业教育机构

400-811-9990
手机站
千锋教育

千锋学习站 | 随时随地免费学

千锋教育

扫一扫进入千锋手机站

领取全套视频
千锋教育

关注千锋学习站小程序
随时随地免费学习课程

上海
  • 北京
  • 郑州
  • 武汉
  • 成都
  • 西安
  • 沈阳
  • 广州
  • 南京
  • 深圳
  • 大连
  • 青岛
  • 杭州
  • 重庆
当前位置:太原千锋IT培训  >  技术干货  >  Spring-retry框架的使用

Spring-retry框架的使用

来源:千锋教育
发布人:qyf
时间: 2023-03-01 18:05:58

Spring-retry框架的使用

  一. 问题

  近日有学生问老师,应该怎样理解【阿里巴巴开发规约中提到的乐观锁至少要重试三次】的规定,为了让大家更好的理解这一点,耀哥先来引用一下阿里巴巴开发规约中的相关规定。

  【强制】并发修改同一记录时,避免更新丢失,需要加锁。要么在应用层加锁,要么在缓存加锁,要么在数据库层使用乐观锁,使用 version 作为更新依据。

  二. 解答

  对于这个问题,;老师是这么认为的。【乐观锁采用CAS机制,在事务的最后才会根据version来判断事务是否能够提交成功。很多时候,仅仅只是因为其他的事务快一步更新了version,就导致整个事务提交失败,这样给用户的体验并不好,所以咱们要在这里让事务重试几次,提升用户的使用体验】。

  其实重试的方式有很多,今天耀哥来给大家介绍一款Spring自带的重试框架 【spring-retry】

  三. spring-retry 框架介绍

  2.1 spring-retry框架是什么

  spring-retry是spring提供的一个重试框架,它通过几个注解就可以优雅的实现重试的功能。

  2.2 怎样使用spring-retry框架

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

  在主程序能够扫描到的类上,或者直接在主程序上添加@EnableRetry注解,开启重试

  @SpringBootApplication

  @EnableRetry

  public class BankApplication {

  public static void main(String[] args) {

  SpringApplication.run(BankApplication .class, args);

  }

  }

  在有可能需要重试的方法上添加注解

  @Transactional

  @Retryable(value = { RetryException.class }, maxAttempts = 3, backoff = @Backoff(delay = 1000l, multiplier = 2,maxDelay = 10000l))

  // @Retryable 加上此注解 那么这个方法就有可能重试

  // value = { RetryException.class } 当方法中抛出RetryException异常就要重试

  // maxAttempts 最大重试的次数

  // Backoff 回避策略

  // delay 第一次重试的延迟时间

  // multiplier 下一次重试的延迟时间,公式为:上一次delay* multiplier

  // maxDelay:最长延迟时间

  public void getMoney(String ano, BigDecimal money){

  // 1 查询账号是否存在

  TbAccount tbAccount = accountMapper.selectByPrimaryKey(ano);

  if (tbAccount == null) {

  throw new AppException(ResponseEnum.ACCOUNT_NOT_FOUND);

  }

  // 2 余下额度是否够

  if(tbAccount.getAccountMoney().compareTo(money)<0){

  throw new AppException(ResponseEnum.ACCOUNT_MONEY_NOT_ENOUTH);

  }

  // 3 更新取钱

  int count = accountMapper.updateMoney(ano, money, tbAccount.getVersion());

  if(count==0){

  throw new RetryException("");

  }

  System.out.println("取钱成功");

  }

  如果最大重试次数也重试完了,但还是失败的话,添加我们将要执行的逻辑

  @Recover

  public void recover(RetryException e) {

  throw new AppException(ResponseEnum.ACCOUNT_EXCEPTION);

  }

  四. 小结

  到此,细心的同学应该已经能发现,spring-retry这个框架的底层原理其实就是aop的异常增强。当方法中抛出指定类型异常的时候,我们就给予一定次数的重试。

  另外,重试的业务场景也不一定就局限在乐观锁上面,其他很多业务场景也需要使用到重试。

  比如说:

  由于网络波动或者系统太忙,造成远程调用失败需要重试;

  秒杀时使用分布式锁时,当一个事务锁住商品,导致其他的购买请求不能正常进行时也需要重试。

声明:本站稿件版权均属千锋教育所有,未经许可不得擅自转载。

猜你喜欢LIKE

React的遮羞布

2023-01-31

Local Storage的高阶用法

2023-01-31

javascript中如何将伪数组转换成真数组

2023-01-30

最新文章NEW

变量的预解析

2023-01-31

Vue中常见的组件间通信方案及典型应用场景

2023-01-31

VueJS中的动画菜单效果的实现

2023-01-31

相关推荐HOT

更多>>

快速通道 更多>>

最新开班信息 更多>>

网友热搜 更多>>