重試工具類(lèi)

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;
        }
    }
}



?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末梦重,一起剝皮案震驚了整個(gè)濱河市氯材,隨后出現(xiàn)的幾起案子做修,更是在濱河造成了極大的恐慌嵌屎,老刑警劉巖疯暑,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件罕容,死亡現(xiàn)場(chǎng)離奇詭異备恤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)锦秒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)露泊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人旅择,你說(shuō)我怎么就攤上這事惭笑。” “怎么了生真?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵沉噩,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我柱蟀,道長(zhǎng)川蒙,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任长已,我火速辦了婚禮畜眨,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘术瓮。我一直安慰自己康聂,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布胞四。 她就那樣靜靜地躺著恬汁,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辜伟。 梳的紋絲不亂的頭發(fā)上氓侧,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天脊另,我揣著相機(jī)與錄音,去河邊找鬼约巷。 笑死尝蠕,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的载庭。 我是一名探鬼主播看彼,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囚聚!你這毒婦竟也來(lái)了靖榕?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤顽铸,失蹤者是張志新(化名)和其女友劉穎茁计,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體谓松,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡星压,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了鬼譬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片娜膘。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖优质,靈堂內(nèi)的尸體忽然破棺而出竣贪,到底是詐尸還是另有隱情,我是刑警寧澤巩螃,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布演怎,位于F島的核電站,受9級(jí)特大地震影響避乏,放射性物質(zhì)發(fā)生泄漏爷耀。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一拍皮、第九天 我趴在偏房一處隱蔽的房頂上張望歹叮。 院中可真熱鬧,春花似錦春缕、人聲如沸盗胀。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至女阀,卻和暖如春宅荤,著一層夾襖步出監(jiān)牢的瞬間屑迂,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工冯键, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留惹盼,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓惫确,卻偏偏與公主長(zhǎng)得像手报,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子改化,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容