一個verticle是部署在Vert.x.單位 每一個verticle包含啓動它的主要手段。 一個應用程序能夠是單個verticle或者能夠由與彼此經由事件總線通訊的多個verticles的。數據庫
Verticles在Vert.x實例中運行。 每一個Vert.x實例在其本身的JVM實例運行,而且能夠承載多個verticles。 一個Vert.x實例確保verticles彼此經過運行每一個在其本身的類加載器分離,因此沒有修改一個靜態變量是另外一個實例的風險。 主機能夠運行一個單一的Vert.x實例或多個的。安全
一個Vert.x實例,保證每一個verticle實例老是在同一個線程執行。 併發Vert.x 是單線程的。網絡
在內部,Vert.x實例維護一組線程(一般爲CPU核心數)是在執行一個事件循環 :檢查,看看是否有工做要作,作到這一點,去睡覺。多線程
Verticles經過使用事件總線傳遞消息通訊。併發
雖然你可能會認爲,共享數據和可擴展性截然相反。 Vert.x提供了一個共享的MAP和跨在同一Vert.x實例中運行verticles傳遞不可改變的數據共享一套設施,這時候數據是可變的惟一真正的 。oop
Vert.x使用相對較少的線程來建立一個事件循環和執行verticles。 但在某些狀況下,須要verticle作一些要麼昂貴計算,或可能阻塞,如鏈接到數據庫。 當發生這種狀況Vert.x可讓你標記verticle實例做爲worker verticle 。Vert.x確保worker verticles將永遠不會被同時執行,因此要他們保持在最低水平,但他們在那裏幫助你,當你須要他們,在這種狀況下,將由後臺執行的線程池執行。this
1,標準Verticlespa
這是最多見的一種,它是由一個event loop 線程來執行。它被建立的時候分分配到一個event loop線程,並使用這個線程調用它的start方法。它保證在這個實例中執行的代碼都是在同一個event loop線程中執行。線程
2,Worker Verticlesrest
它使用worker 線程池中的一個線程執行,一個實例自始至終都是使用同一個線程執行。相似於標準Verticles,可是使用的是worker 線程池,它通常用來執行那些有阻塞的代碼,好比網絡請求,數據庫請求,文件建立等等,這樣它就不會阻塞event loop線程了。能夠像下面這樣建立一個worker Verticles
DeploymentOptions options = new DeploymentOptions().setWorker(true); vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
3,多線程Worker Verticles
它也是使用wroker線程池中的一個線程執行,一個實現可使用多個線程同時執行。它須要用戶本身保證每一個Verticles的併發安全性。Vertx的客戶端和服務端不能在這裏面建立,要否則它會拋出一個異常。
部署一個Verticles
Verticle myVerticle = new MyVerticle(); vertx.deployVerticle(myVerticle);
使用Json傳入配置
JsonObject config = new JsonObject().put("name", "tim").put("directory", "/blah"); DeploymentOptions options = new DeploymentOptions().setConfig(config); vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
Context
獲取Context
Context context = vertx.getOrCreateContext();
判斷Context的類型
Context context = vertx.getOrCreateContext(); if (context.isEventLoopContext()) { System.out.println("Context attached to Event Loop"); } else if (context.isWorkerContext()) { System.out.println("Context attached to Worker Thread"); } else if (context.isMultiThreadedWorkerContext()) { System.out.println("Context attached to Worker Thread - multi threaded worker"); } else if (! Context.isOnVertxThread()) { System.out.println("Context not attached to a thread managed by vert.x"); }
Context中加入共享數據
final Context context = vertx.getOrCreateContext(); context.put("data", "hello"); context.runOnContext((v) -> { String hello = context.get("data"); });
定時
執行一次
long timerID = vertx.setTimer(1000, id -> { System.out.println("And one second later this is printed"); }); System.out.println("First this is printed");
執行屢次
long timerID = vertx.setPeriodic(1000, id -> { System.out.println("And every second this is printed"); }); System.out.println("First this is printed");
在執行屢次任務時,若是間隔時間過短,而任務執行的時間又太長,並不會阻止定時器的運行。建議可使用執行一次,成功以後再添加執行一次。
Event Bus
它是整個系統的神經網絡,用於不一樣模塊數據之間的交互,有publish/subscribe, point-to-point, and request-response messaging.
若是發送消息以後但願接收返回消息,可使用下面的方式:
發送者:
eventBus.send("news.uk.sport", "Yay! Someone kicked a ball across a patch of grass", ar -> { if (ar.succeeded()) { System.out.println("Received reply: " + ar.result().body()); } });
接收者:
MessageConsumer<String> consumer = eventBus.consumer("news.uk.sport"); consumer.handler(message -> { System.out.println("I have received a message: " + message.body()); message.reply("how interesting!"); });