使用spring-retry实现重试机制 原

我们经常会遇到一些场景,需要重试当前的操作,比如:文件上传失败,重新上传;微信accesstoken获取失败,重新获取等等的场景问题。那么今天就说一种可以实现此种机制的工具包:spring-retry。

如图,可以看到spring-retry最新版本是1.2.2.RELEASE, 该工具把重试操作模板定制化,可以设置重试策略和回退策略。同时重试执行实例保证线程安全

要是用它,先引入架包:

<!-- https://mvnrepository.com/artifact/org.springframework.retry/spring-retry -->
<dependency>
    <groupId>org.springframework.retry</groupId>
    <artifactId>spring-retry</artifactId>
    <version>1.2.2.RELEASE</version>
</dependency>

具体的代码实现:

         // 构建重试模板实例
		RetryTemplate retry=new RetryTemplate();
		//设置重试策略,主要设置重试次数
		SimpleRetryPolicy srp = new SimpleRetryPolicy(); 
		srp.setMaxAttempts(3);// 重试3次 
		//设置重试回退操作策略,主要设置重试间隔时间
		FixedBackOffPolicy fbop = new FixedBackOffPolicy();
		fbop.setBackOffPeriod(2000);//重试间隔2s,单位ms
		retry.setRetryPolicy(srp);
		retry.setBackOffPolicy(fbop);
		
		//重试器,重试成功后返回 true
		final RetryCallback<Object, Exception> dmReCall=new RetryCallback<Object, Exception>(){
			@Override 
			public Object doWithRetry(RetryContext context) throws Exception {// 开始重试 
				//这里填写要重试的逻辑代码
				System.out.println("do some thing");
                 //规定在哪种状态下,发生异常,才会进行重试
                 if(true){

                      throw new RuntimeException();//这里需要注意,重试的根源是抛出异常
                   }
                                
				return null; //成功之后返回的数据,可以是任意数据类型
			}
		};
		//重试失败后,执行-
		final RecoveryCallback<Object> rvcb=new RecoveryCallback<Object>(){
			@Override 
			public Object recover(RetryContext context) throws Exception { // 重试多次后都失败了 
			        //这里可以添加最后失败的代码逻辑	
                    logger.info("------- RecoveryCallback --------");
				return false; //重试后失败返回的数据,可以是任意数据类型
			} 
		};
		//删除菜单重试机制开始
		try {
			
			Object obj = retry.execute(dmReCall,rvcb);
			//这里可以根据obj的数据进行判断,重试最终成功了,还是失败了。
			System.out.println("do some obj");
		} catch (Exception e) {
			//error
		}

RetryTemplate 承担了重试执行者的角色,它可以设置SimpleRetryPolicy(重试策略,设置重试上限,重试的根源实体),FixedBackOffPolicy(固定的回退策略,设置执行重试回退的时间间隔)。      RetryTemplate通过execute提交执行操作,需要准备RetryCallback 和RecoveryCallback 两个类实例,前者对应的就是重试回调逻辑实例,包装正常的功能操作,RecoveryCallback实现的是整个执行操作结束的恢复操作实例。同时RetryTemplate的execute 是线程安全的。

有重试机制需要的,可以尝试下这个工具。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章