- 创建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); }
}
```