Vertx - Future.compose

1.vertx中的Future與java原生中不同,二者都有封裝結果的功能,但是vertx中為了避免await阻塞event loop線程,導致不能及時響應的問題.通過在Future中定義回調(diào)Handler來解決這個問題.
demo1:

    private static void asynchronousMethod(Future<String> f){
        f.complete("haha");
    }
    
    public static void main(String[] args) {    
        Future<String> future = Future.future();
        future.setHandler(r -> {
            System.out.println("result is:" + r);
        });
        asynchronousMethod(future); 
    }

demo1解釋:
1.定義一個結果類型為String的Future.
2.為這個Future設置回調(diào).
3.調(diào)用異步方法,將這個Future作為參數(shù)傳入
4.complete()將調(diào)用結果封裝進Future,并將Future的狀態(tài)置為completed.返回.
5.最后回調(diào)函數(shù)執(zhí)行,處理調(diào)用結果.

需要理清的是,
Future<T> 中的T代表的是返回的結果類型.
Handler<AsyncResult<T>> 是對調(diào)用結果的處理函數(shù).

2.理解compose,compose是為了應對回調(diào)地獄采用的鏈式寫法.
compose的第一種寫法:

  default <U> Future<U> compose(Handler<T> handler, Future<U> next) {
    setHandler(ar -> {
      if (ar.succeeded()) {
        try {
          handler.handle(ar.result());
        } catch (Throwable err) {
          if (next.isComplete()) {
            throw err;
          }
          next.fail(err);
        }
      } else {
        next.fail(ar.cause());
      }
    });
    return next;
  }

傳入?yún)?shù)為
1.調(diào)用此compose方法的future的handler,
2.下一個future

處理思路:
1.執(zhí)行compose調(diào)用future的回調(diào)處理
2.如果當前future的回調(diào)處理中出錯,那么將下一個future置為失敗,
3.未出錯則直接將下一個future返回.
demo2:

        Future<String> f1 = Future.future();
        Future<Integer> f2 = Future.future();

        f1.complete("f1's result");

        f1.compose(r -> {
            System.out.println("f1 handler:" + r);
            f2.complete(123);
        } , f2).setHandler(r -> {
            System.out.println("f2 handler:" + r.result());
        });

demo2解釋:
1.定義2個future
2.第4行模擬第1個異步調(diào)用完畢,f1得到結果,狀態(tài)completed.
3.f1發(fā)起compose,參數(shù)1為f1的handler,參數(shù)2為下一個future f2
4.注意,在f1的handler中,模擬第2個異步調(diào)用完畢,f2狀態(tài)轉為completed,從而觸發(fā)f2的handler.

compose的第2種寫法

  default <U> Future<U> compose(Function<T, Future<U>> mapper) {
    if (mapper == null) {
      throw new NullPointerException();
    }
    Future<U> ret = Future.future();
    setHandler(ar -> {
      if (ar.succeeded()) {
        Future<U> apply;
        try {
          apply = mapper.apply(ar.result());
        } catch (Throwable e) {
          ret.fail(e);
          return;
        }
        apply.setHandler(ret);
      } else {
        ret.fail(ar.cause());
      }
    });
    return ret;
  }

處理思路:
1.傳入?yún)?shù)類型Function<T, Future<U>>,說明傳入的是一個轉換函數(shù),此函數(shù)將future中的調(diào)用結果T轉換為鏈中的下一個future.
2.如果調(diào)用是成功的,那么將調(diào)用結果作為參數(shù)傳入這個function執(zhí)行,就是這句"apply = mapper.apply(ar.result());",返回結果為Future<U>.
3.由于事先需要對調(diào)用結果ar是否成功判斷,所以外面再套了個Future<U> ret.
4.將ret返回.
這個封裝蠻有意思,在compose方法中設置調(diào)用者future的handler,在handler中將future中的結果ar傳遞給compose參數(shù)(function),然后執(zhí)行function,最后將function返回的future用compose內(nèi)部生成的future封裝下返回.
demo3:

        Future<String> f1 = Future.future();
        f1.complete("f1's result");
        
        f1.compose(r -> {
            System.out.println(r);
            Future<String> f2 = Future.future();
            f2.complete("f2's result");
            return f2;
        }).compose(r -> {
            System.out.println(r);
            Future<String> f3 = Future.future();
            f3.complete("f3's result");
            return f3;
        }).setHandler(r -> {
            System.out.println(r.result());
        });

雖然api封裝復雜了些,但是使用過程比第1種寫法更加簡單了.也容易理解.

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末镐牺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌脊岳,老刑警劉巖颖系,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拨与,死亡現(xiàn)場離奇詭異,居然都是意外死亡芬萍,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進店門搔啊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來柬祠,“玉大人,你說我怎么就攤上這事负芋÷祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵旧蛾,是天一觀的道長莽龟。 經(jīng)常有香客問我,道長锨天,這世上最難降的妖魔是什么毯盈? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮病袄,結果婚禮上搂赋,老公的妹妹穿的比我還像新娘赘阀。我一直安慰自己,他們只是感情好脑奠,可當我...
    茶點故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布基公。 她就那樣靜靜地躺著,像睡著了一般捺信。 火紅的嫁衣襯著肌膚如雪酌媒。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天迄靠,我揣著相機與錄音秒咨,去河邊找鬼。 笑死掌挚,一個胖子當著我的面吹牛雨席,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播吠式,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼陡厘,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了特占?” 一聲冷哼從身側響起糙置,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎是目,沒想到半個月后谤饭,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡懊纳,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年揉抵,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗤疯。...
    茶點故事閱讀 40,096評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡冤今,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出茂缚,到底是詐尸還是另有隱情戏罢,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布脚囊,位于F島的核電站帖汞,受9級特大地震影響,放射性物質發(fā)生泄漏凑术。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一所意、第九天 我趴在偏房一處隱蔽的房頂上張望淮逊。 院中可真熱鬧催首,春花似錦、人聲如沸泄鹏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽备籽。三九已至舶治,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間车猬,已是汗流浹背霉猛。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留珠闰,地道東北人惜浅。 一個月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓,卻偏偏與公主長得像伏嗜,于是被迫代替她去往敵國和親坛悉。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,037評論 2 355