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 重試工具類(lèi)
*/
@Slf4j
public class Retry<T> {
/**
* 默認(rèn)重試次數(shù)
*/
private int maxRetryTimes = 3;
/**
* 重試的 對(duì)象
*/
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怜奖、方法的超時(shí)時(shí)間
* @param maxRetryTimes 重試次數(shù)
* @param operation 重試的方法
* @param judgements 校驗(yàn)
* @param exceptionCallback 異趁贫撸回調(diào)
* @return
* @throws Exception 重試次數(shù)達(dá)到 指定次數(shù)后如果有異常拋出異常
*/
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> {
/**
* 返回的對(duì)象
*
* @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;
}
}
}
重試工具類(lèi)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門(mén)露泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旅择,你說(shuō)我怎么就攤上這事惭笑。” “怎么了生真?”我有些...
- 文/不壞的土叔 我叫張陵沉噩,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柱蟀,道長(zhǎng)川蒙,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任长已,我火速辦了婚禮畜眨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘术瓮。我一直安慰自己康聂,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開(kāi)白布胞四。 她就那樣靜靜地躺著恬汁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辜伟。 梳的紋絲不亂的頭發(fā)上氓侧,一...
- 那天脊另,我揣著相機(jī)與錄音,去河邊找鬼约巷。 笑死尝蠕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的载庭。 我是一名探鬼主播看彼,決...
- 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囚聚!你這毒婦竟也來(lái)了靖榕?” 一聲冷哼從身側(cè)響起,我...
- 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顽铸,失蹤者是張志新(化名)和其女友劉穎茁计,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谓松,經(jīng)...
- 正文 獨(dú)居荒郊野嶺守林人離奇死亡星压,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
- 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鬼譬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜膘。...
- 正文 年R本政府宣布演怎,位于F島的核電站,受9級(jí)特大地震影響避乏,放射性物質(zhì)發(fā)生泄漏爷耀。R本人自食惡果不足惜,卻給世界環(huán)境...
- 文/蒙蒙 一拍皮、第九天 我趴在偏房一處隱蔽的房頂上張望歹叮。 院中可真熱鬧,春花似錦春缕、人聲如沸盗胀。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至女阀,卻和暖如春宅荤,著一層夾襖步出監(jiān)牢的瞬間屑迂,已是汗流浹背。 一陣腳步聲響...
- 正文 我出身青樓惫确,卻偏偏與公主長(zhǎng)得像手报,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子改化,可洞房花燭夜當(dāng)晚...
推薦閱讀更多精彩內(nèi)容
- 版權(quán)申明 原創(chuàng)文章:本博所有原創(chuàng)文章,歡迎轉(zhuǎn)載陈肛,轉(zhuǎn)載請(qǐng)注明出處揍鸟,并聯(lián)系本人取得授權(quán)。版權(quán)郵箱地址:banquan@...
- Java 8 實(shí)現(xiàn)一個(gè)簡(jiǎn)單的錯(cuò)誤重試工具類(lèi) 首先實(shí)現(xiàn)這個(gè)工具類(lèi)需要熟悉一下Java 8的函數(shù)式編程或者對(duì)匿名內(nèi)部類(lèi)...
- 官方文檔地址: https://github.com/rholder/guava-retrying 打印結(jié)果 稍微...
- 該類(lèi)可以實(shí)現(xiàn)自動(dòng)類(lèi)型判斷模擬一些比較合理的數(shù)據(jù)句旱,比如對(duì)于時(shí)間字段對(duì)于昵稱(chēng)字段對(duì)于頭像字段的假數(shù)據(jù)自動(dòng)填充阳藻。 在服務(wù)...