- 創建Vertx實例
Vertx vertx = Vertx.vertx();
- 添加配置
Vertx vertx = Vertx.vertx(new VertxOptions().setWorkerPoolSize(40));
- Don’t call us, we’ll call you.
Vert.x 的API大部分都是事件驅動的,Vert.x通過發送事件的方式調用你的handler。vertx.setPeriodic(1000, id -> { //1. This handler will get called every second //2. Called by a event loop thread System.out.println("timer fired!"); });
當Vert.x有事件傳遞到你的handler後,Vert.x會通過異步的方式調用,所以handler中的業務邏輯不能是阻塞性操作。
-
Multi-Reactor
與Node.js不同的是,eventloop的線程數是可配置的,這種模式被稱爲Multi-Reactor。對應event loop的不同,包含三種模式:- Standard Verticle: 最通用的類型,總是在event loop中執行。
- Worker Verticle:它們使用worker pool線程池運行。一個verticle實例絕對不會在兩個或者更多線程中併發執行。
- Multi-threaded worker verticle:它們使用worker pool線程池運行。 一個verticle實例可以在多個線程中併發執行。
-
event loop
大部分情況下Vert.x通過一個名爲event loop的線程調用你的handler。 -
Reactor pattern
在沒有阻塞的情況下,event loop可以持續快速的傳遞事件給不同的handler,一個event loop 線程可以在很短的時間處理大量的事件,例如,一個event loop可以處理成千上萬的HTTP請求。這就是傳說的Reactor 模式 -
執行阻塞操作
vertx.executeBlocking(promise -> { // Call some blocking API that takes a significant amount of time to return String result = someAPI.blockingMethod("hello"); promise.complete(result); }, res -> { System.out.println("The result is: " + res.result()); });
-
The Context object
When Vert.x provides an event to a handler or calls the start or stop methods of a Verticle,
the execution is associated with a Context. Usually a context is an event-loop context and is tied to a specific event loop thread.
通過綁定線程的方式,保證線程安全 -
EventBus
繼承Verticle,在start()中執行public static void main(String[] args) { Consumer<Vertx> runner = vertx -> { try { vertx.deployVerticle(Receiver.class.getName()); } catch (Throwable t) { t.printStackTrace(); } }; Vertx.clusteredVertx(new VertxOptions(), res -> { if (res.succeeded()) { Vertx vertx = res.result(); runner.accept(vertx); } else { res.cause().printStackTrace(); } }); }
-
Router
public class RouteTest { public static void main(String[] args) { Vertx vertx = Vertx.vertx(); HttpServer server = vertx.createHttpServer(); Router router = Router.router(vertx); Route route = router.route(HttpMethod.POST, "/name/age/:name/:age/"); route.handler(routingContext -> { String name = routingContext.request().getParam("name"); String age = routingContext.request().getParam("age"); routingContext.response().end(name+":"+age); }); server.requestHandler(router).listen(8080); }
}
```