适用场景
在项目开发过程中,偶尔会有使用网络的情况, 我们不希望一次网络不通就出错,而是连接了几次不通才算他出错.
依赖
hutool工具依赖只是使用了它的HttpUtil中的方法,与重试机制无关
<!--重试机制-->
<dependency>
<groupId>org.springframework.retry</groupId>
<artifactId>spring-retry</artifactId>
<version>1.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.6</version>
</dependency>
<!-- hutool工具 -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.5.4</version>
</dependency>
启动类
添加注解@EnableRetry
@SpringBootApplication
@EnableScheduling
@EnableRetry
public class ConvertApplication {
public static void main(String[] args) {
SpringApplication.run(ConvertApplication.class, args);
}
}
重试机制类
package com.govthai.convert.service;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONUtil;
import com.govthai.convert.utils.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.retry.annotation.Backoff;
import org.springframework.retry.annotation.Recover;
import org.springframework.retry.annotation.Retryable;
import org.springframework.stereotype.Component;
import java.util.Map;
/**
* @author gzh
* @Classname RetryPing
* @Date 2021/4/30 9:15
*/
@Component
@Slf4j
public class RetryPing {
/**
* 连接并允许尝试3次
*
* @param url
* @param paramMap
* @return
*/
@Retryable(value = {Exception.class}, backoff = @Backoff(delay = 2000, multiplier = 1.5))
public int isExist(String url, Map<String, Object> paramMap) {
log.info("尝试连接");
String resultStr = HttpUtil.get(url, paramMap);
Result result = JSONUtil.toBean(resultStr, Result.class);
return Integer.parseInt(result.getData().toString());
}
/**
* 如果连接三次未果,返回-1
*
* @param e
* @return
* @throws ArithmeticException
*/
@Recover
public int doRecover(Exception e) throws ArithmeticException {
log.info("多次尝试连接失败,转换下一户");
return -1;
}
}
@Retryable:标记当前方法会使用重试机制
value:重试的触发机制,当遇到Exception异常的时候,会触发重试,这里的Exception你也可以写的更精确。
maxAttempts:重试次数(包括第一次调用)
delay:重试的间隔时间
multiplier:delay时间的间隔倍数
maxDelay:重试次数之间的最大时间间隔,默认为0,如果小于delay的设置,则默认为30000L
@Recover:标记方法为回调方法,传参与@Retryable的value值需一致
运行结果
可以看到,isExist方法执行了三次,全部失败之后执行下面这个最终方法。