package cn.freemud.es.manager.retry;
import com.google.gson.Gson;
import lombok.extern.slf4j.Slf4j;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
/**
* @author hongwang.zhang 重试工具类
*/
@Slf4j
public class Retry<T> {
/**
* 默认重试次数
*/
private int maxRetryTimes = 3;
/**
* 重试的 对象
*/
private Operation<T> operation;
/**
* 判断是否成功
*/
private List<Judgement<T>> judgements;
/**
* 异常 call
*/
private ExceptionCallback exceptionCallback;
public Retry<T> maxRetryTimes(int maxRetryTimes) {
this.maxRetryTimes = maxRetryTimes;
return this;
}
public Retry<T> operation(Operation<T> operation) {
this.operation = operation;
return this;
}
public Retry<T> judgement(Judgement<T> judgement) {
if (this.judgements == null) {
this.judgements = new ArrayList<>();
}
this.judgements.add(judgement);
return this;
}
public Retry<T> exceptionCallback(ExceptionCallback exceptionCallback) {
this.exceptionCallback = exceptionCallback;
return this;
}
public T execute(){
return execute(this.maxRetryTimes,this.operation,this.judgements,this.exceptionCallback);
}
/**
*
* todo 1、池化 2、方法的超时时间
* @param maxRetryTimes 重试次数
* @param operation 重试的方法
* @param judgements 校验
* @param exceptionCallback 异常回调
* @return
* @throws Exception 重试次数达到 指定次数后如果有异常抛出异常
*/
public T execute(int maxRetryTimes, Operation<T> operation, List<Judgement<T>> judgements,ExceptionCallback exceptionCallback) {
if (Objects.isNull(operation)) {
throw new NullPointerException("operation not is null");
}
boolean isBreak = false;
T operate =null;
int times = 1;
while(times <= maxRetryTimes && (!isBreak)){
try {
operate = operation.operate();
}catch (Exception e){
log.error("Retry.execute,times:{},exception:{}", times,new Gson().toJsonTree(e));
if(Objects.nonNull(exceptionCallback)){
exceptionCallback.call(e);
}
}
if (null != judgements && judgements.size() > 0) {
boolean judge = false;
for (Judgement<T> judgement : judgements) {
judge = judgement.judge(operate);
if(!judge){
times ++;
break;
}
}
if(judge){
isBreak = true;
}
}else {
isBreak = true;
}
}
return operate;
}
public interface Operation<T> {
/**
* 返回的对象
*
* @return
*/
T operate() throws IOException;
}
public interface ExceptionCallback<T> {
/**
* 异常处理
* @return
*/
void call(Exception e);
}
/**
* 断言
*
* @param <T>
*/
public interface Judgement<T> {
/**
* 判断是否成功
*
* @param t
* @return
*/
boolean judge(T t);
}
/**
* 非空判断
*/
public class IsNullJudgement implements Judgement<T> {
@Override
public boolean judge(T t) {
return t == null;
}
}
}
重试工具类
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
推荐阅读更多精彩内容
- Java 8 实现一个简单的错误重试工具类 首先实现这个工具类需要熟悉一下Java 8的函数式编程或者对匿名内部类...
- 官方文档地址: https://github.com/rholder/guava-retrying 打印结果 稍微...
- 该类可以实现自动类型判断模拟一些比较合理的数据,比如对于时间字段对于昵称字段对于头像字段的假数据自动填充。 在服务...