vertx verticle


以下內容為隨手記的,若看客不知鄙人所雲,還請原諒則個..............

公司用的vertx,在國內,這還是款比較年輕的框架,你也可以把他當做一個工具,官網上的說法是:

Vert.x is a tool-kit for building reactiveapplications on the JVM.

公司一直用的標准的verticle,因為並沒有什么長任務或阻塞任務的接口,所以一直沒有使用worker verticle的強烈需求,即使后來簡單重構,也只是用注解和反射外加封裝,精簡了項目的代碼量,私以為,沒有worker verticle的vertx能稱為vertx嗎·········

今天試了試worker verticle,遇見了一些小坑,來篇隨筆,紀念一下:

我在老大給的demo里面將所有的標准的verticle替換成 worker verticle,然后故意阻塞一個verticle1里的方法,調用另一個verticle2的某個方法,或者調用阻塞的verticle1的某個方法,總是阻塞,無法成功調用,找了半天才發現,老大給的demo的里的數據庫連接數就給了如下:

<property name="initialSize" value="1"/>
<property name="minIdle" value="1"/>
<property name="maxActive" value="2"/>
我不停的調用接口,所以連接數不夠,發現原因的我眼淚留下來,我擦淚·············

增加連接數后,果然接口能調通了,瞬間喜大普奔,
but!!!!!!!!!!
當被阻塞的方法處於阻塞狀態時,此時再次調用該方法,也是處於阻塞等待狀態,必須等待前一次調用的阻塞的方法結束后才能執行,
有點繞口,容我重新組織一下語言,
該方法中有如下判斷:
if(i==1){
Thread.sleep(100000);
}
第一次調該方法時,i=1;第二次調用該方法時,i=2;所以第一次被阻塞,第二次不阻塞;
第二次調用 仍然 會等待 第一次 執行完成后,才會執行第二次調用。

查看文檔,研究半天,發現:
worker verticles不會並行的執行Handler.而是阻塞式的,等待上一個Handler處理完了,才會再執行后面的請求!
這怎么可以,我可是一個想讓所有verticle的每個方法都可以並行執行的偉大的man,
so!
我發現了個神奇的api:
<T> void executeBlocking(Handler<Future<T>> blockingCodeHandler, boolean ordered, Handler<AsyncResult<T>> resultHandler);
這個api的參數:ordered可以指定worker verticles是順序執行還是並發執行。

使用之后發現,
改方法第一次被阻塞,第二次調用沒有被阻塞(在第一次調用仍處於阻塞狀態時);

終於,問題解決了,瞬間神清氣爽,
啦啦德瑪西亞!

以上
(公司產品代碼,不好公開,看客見諒)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM