vert.x 學習筆記

Verticle

  • 一個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

Verticle

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!");
});
相關文章
相關標籤/搜索