查看: 87008|回复: 58115
打印 上一主题 下一主题

自己动手实践 spring retry 重试框架

[复制链接]
bwin亚洲必赢5566
跳转到指定楼层
楼主
发表于 2019-04-19 16:18:45 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式

“没什么,他的不死之身我身边一个人有点兴趣说要研究一下,问他拿点鲜血而已。“刘皓直接说出了自己来的目的,本来他还以为更强的角都应该会赢的,只可惜现在遇到更强的会仙人模式的鸣人却还是败了。

UU快三代理※环球彩票※

大鹏苦笑,自己以为修至混元金仙,当可来去无碍,不想却被文殊一柄宝剑逼得手忙脚乱。他横起方天戟硬接上去,忽觉空中一个青色大鼎将他罩在正中,他这一挡拦到了空处。只听当的一声巨响,八杆金刚杵一齐砸在这巨鼎之上。
不是别人赫然是刘皓,和之前的样子没有半分变化,但是他的气息却是让所有人都一阵凛然,太乙金仙大圆满。

面对红衣凌厉的一击蕴藏的恐怖气劲就算苍穹血尊也不敢大意,没办法玄阴杀葵星可是不能用常理来衡量的,尤其是他察觉到红衣这一招的厉害,连忙一掌迎了上去。

前序

马上过年了,预祝大家,新年快乐,少写bug

什么是spring retry?

spring retry是从spring batch独立出来的一个能功能,主要实现了重试和熔断。

什么时候用?

远程调用超时、网络突然中断可以重试。对于重试是有场景限制的,不是什么场景都适合重试,比如参数校验不合法、写操作等(要考虑写是否幂等)都不适合重试。

怎么用?

1,首先我们新建一个maven工程(如果不会,请移步 http://www.cnblogs.com/JJJ1990/p/8384386.html,大佬请忽略),然后在pom文件中引入spring retry 的jar包,代码如下:

1   <!-- spring-retry重试机制  -->
2         <dependency>
3             <groupId>org.springframework.retry</groupId>
4             <artifactId>spring-retry</artifactId>
5             <version>1.1.2.RELEASE</version>
6         </dependency>

2,编写重试部分代码,我们直接在app类的main方法中实现

首先我们先制定好重试策略,也就是当异常发生后,我们重试几次,每次间隔多久等

如下代码中,第一行为新建一个重试模板,第二行为制定一个简单重试策略,特别注意最后的数字3,这就是我们设置的要重试的次数

1 final RetryTemplate retryTemplate = new RetryTemplate();
2         final SimpleRetryPolicy policy = new SimpleRetryPolicy(3, 
3                 Collections.<Class<? extends Throwable>,
4                 Boolean>singletonMap(Exception.class, true));

3,下面再设置退避策略,注意第二行 2000为每次间隔的时间,单位ms,然后再将 重试策略和退避策略设置到重试模板中如第3.4行

1 FixedBackOffPolicy fixedBackOffPolicy = new FixedBackOffPolicy();
2         fixedBackOffPolicy.setBackOffPeriod(2000);
3         retryTemplate.setRetryPolicy(policy);
4         retryTemplate.setBackOffPolicy(fixedBackOffPolicy);

4,编写重试业务部分代码如下,主要是实现RetryCallback接口的 doWithRetry 方法,在这个里面就是编写主要的业务逻辑了。我在这块模拟了一个异常,通过数组下标越界异常,来进行重试

1 final RetryCallback<String, Exception> retryCallback = new RetryCallback<String, Exception>() {
2             public String doWithRetry(RetryContext context) throws Exception {
3                 System.out.println(new Date());
4                 System.out.println("retryCallback");
5                 String [] str = new String [2];
6                 str[3] = "";
7                 return "1";
8             }
9         };

5,编写恢复回调代码如下,也是实现了RecoveryCallback接口中的recover方法,这个方法的作用就是当第4步重试代码按照重试策略执行完毕后,依旧异常,那就会执行下面的代码,这样你就可以通过下面的代码,来规避异常

1 final RecoveryCallback<String> recoveryCallback = new RecoveryCallback<String>() {
2             public String recover(RetryContext context) throws Exception {
3                 System.out.println("recoveryCallback");
4                 return null;
5             }
6         };

6,编写重试模板执行重试代码及恢复回调代码

1 try {
2             System.out.println("retryTemplate execute start");
3             String response = retryTemplate.execute(retryCallback, recoveryCallback);
4             System.out.println("retryTemplate execute end");
5         } catch (Exception e) {
6             e.printStackTrace();
7         }

测试代码

启动程序,注意整个代码是全部在main方法中实现的,我们直接启动程序看打印的日志信息,从日志信息中可以得知,我们在启动程序后先进入execute方法,然后执行retrycallback,但是每次执行的时候都有数组下标越觉异常,所以他就重试了3次,而且每次的时间间隔是我们设置的2秒,当第三次执行失败后,就调用recovercallback方法,然后整个程序结束。

退别策略有哪些?

1,我们上面的代码中用的退别策略是固定时间间隔,还有其他几种的退避策略大致如下:

  • NoBackOffPolicy:无退避算法策略,每次重试时立即重试

  • FixedBackOffPolicy:固定时间的退避策略,需设置参数sleeper和backOffPeriod,sleeper指定等待策略,默认是Thread.sleep,即线程休眠,backOffPeriod指定休眠时间,默认1秒

  • UniformRandomBackOffPolicy:随机时间退避策略,需设置sleeper、minBackOffPeriod和maxBackOffPeriod,该策略在[minBackOffPeriod,maxBackOffPeriod之间取一个随机休眠时间,minBackOffPeriod默认500毫秒,maxBackOffPeriod默认1500毫秒

  • ExponentialBackOffPolicy:指数退避策略,需设置参数sleeper、initialInterval、maxInterval和multiplier,initialInterval指定初始休眠时间,默认100毫秒,maxInterval指定最大休眠时间,默认30秒,multiplier指定乘数,即下一次休眠时间为当前休眠时间*multiplier

  • ExponentialRandomBackOffPolicy:随机指数退避策略,引入随机乘数可以实现随机乘数回退

我们将第3步的代码进行修改,如下:

1 ExponentialBackOffPolicy exponentialBackOffPolicy = new ExponentialBackOffPolicy();
2         exponentialBackOffPolicy.setInitialInterval(2000);
3         exponentialBackOffPolicy.setMultiplier(3);
4         exponentialBackOffPolicy.setMaxInterval(5000);
5         retryTemplate.setRetryPolicy(policy);
6         retryTemplate.setBackOffPolicy(exponentialBackOffPolicy);

上述代码中,2000为执行的时间间隔,3为倍数,5000为允许的最大间隔时间,执行代码结果如下:

如上图,第一次执行和第二次执行间隔2秒,第二次和第三次的间隔本来是2*3=6秒,但是由于设置了最大间隔所以在5秒的时候就触发了重试

重试业务中的异常不要捕获

在我们的重试业务代码中我们需要根据异常来进行重试,如果你在业务代码中捕获了异常会怎么样??我们修改下第4步代码看看:

 1 final RetryCallback<String, Exception> retryCallback = new RetryCallback<String, Exception>() {
 2             public String doWithRetry(RetryContext context) throws Exception {
 3                 System.out.println(new Date());
 4                 System.out.println("retryCallback");
 5                 try {
 6                     String [] str = new String [2];
 7                     str[3] = "";
 8                 } catch (Exception e) {
 9                     // TODO: handle exception
10                 }
11                 
12                 return "1";
13             }
14         };

如上,很简单,我们直接将数组异常try catch ,然后运行代码结果如下

如上图,从信息中可以看出,本来异常的代码只执行了一次,而且没有调用恢复回调代码。

所以如果你需要执行重试,那么就不要捕获你需要重试的异常信息。

所以如果你需要执行重试,那么就不要捕获你需要重试的异常信息。

所以如果你需要执行重试,那么就不要捕获你需要重试的异常信息。

重要的话说三遍~~~

 

 

 

  

 

自己动手搭建一个简易的SpringBoot环境

编辑:邓丁

发布时间:2019-04-19 11:22:08

当前文章://uno3s8yu/index.html

澳门美高梅娱乐&欢迎您 澳门永利国际平台|首页 乐虎国际app|首页 龙8娱乐 - 官网 美高梅线上娱乐 千亿国际手机版_www.qy88.com_千亿国际官网【唯一授权】 万博娱乐城 新濠天地注册网址 

点击获取礼包
ta娱乐软件
沙发
发表于 2019-04-19 15:00:33 | 只看该作者
于是韩雪梅的心中浮现了一个点子,对着唐欣妩媚一笑,故意将自己那曲线的身材显露而出,对着唐欣问道:“唐欣,对我有没有一些兴趣啊?”同时,韩雪梅还把那个兴趣的兴字咬的非常重,听上去很容易引起他人的误会。
回复 支持 反对

使用道具 举报

聚鑫娱乐网彩平台
板凳
发表于 2019-04-19 14:21:35 | 只看该作者
但是这一股气运对于普通人而言当然很惊人,福缘深厚得很,但是对于修道者而言真的不算什么,只能一点一滴的积累起来。/unoarray/j4lqb.html
回复 支持 反对

使用道具 举报

ulive直播app手机版
地板
发表于 2019-04-19 09:24:43 | 只看该作者
叶扬叹了一口气,只好说道:“我现在连力气都没有,你就算给我,我也是有心无力啊。”
回复 支持 反对

使用道具 举报

美高梅手机版登录4858
5#
发表于 2019-04-19 09:32:50 | 只看该作者
“哎呀妈呀”叶扬禁不住叫了起来,而这个时候,那伪娘竟然也是瞥到了叶扬手中的纸。当他看到叶扬的宿舍号时,也是禁不住叫了起来。
回复 支持 反对

使用道具 举报

优乐娱乐用户登录
6#
发表于 2019-04-19 09:53:03 | 只看该作者
他知道李庆安有这个能力,关键是怎样才能最大程度地运用起来,就这就是他来投奔李庆安的真实目的,这一点,他没有隐瞒,他也知道自己隐瞒不了。
回复 支持 反对

使用道具 举报

亚洲城ca88手机版欢迎你
7#
发表于 2019-04-19 03:13:20 | 只看该作者
波赛西随手一挥,柔和的魂力承托着两扇大门缓缓闭合,将外界的一切隔绝开来。没有光芒的海神殿内依旧是那么黑暗,那七座平台也和以前一模一样。
回复 支持 反对

使用道具 举报

u乐平台官方注册
8#
发表于 2019-04-19 07:47:18 | 只看该作者
而且刘皓现在都已经主动从高达当中下来了,他们也没什么好顾忌的,于是也降落了战舰一个个走了下来,当然必要的防备还是要有的,一部分人还是留在了战舰里面随时做好准备。
回复 支持 反对

使用道具 举报

优乐时时彩平台官方
9#
发表于 2019-04-19 16:40:58 | 只看该作者
“我就知道你也看出了这东西的价值。”刘皓笑道,换了其他人来就算那些斗圣也不知道这东西的价值所在,但是刘皓是见过,而美杜莎则是本身就知道。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

必赢亚洲全部网址是互联网最大的搜索引擎优化研究中心,是致力于培养学员用户体验意识和提供专业技术解答的专业培训机构, 成立于2007年,2008年第一家入驻歪歪的培训机构,2014年成为腾讯课堂战略合作机构。
© 2007-2016 必赢亚洲全部网址 湘ICP备13004652号-1 Powered by Discuz!X  Template by 必赢亚洲全部网址 
快速回复 返回顶部 返回列表