Vert.x核心包各功能模块详解

源码:https://github.com/dagger9527/vertx_demo

vert.x核心包是vertx-core。通常,只需要引入这个依赖就足以创建vert.x的http服务了。不过,vert.x为用户提供了更为强大的扩展模块,例如:vertx-web(创建http server,提供更强大的http服务),vertx-web-client(http客户端)。本章内容将围绕vertx-core模块做详细解释。

首先引入vertx-core依赖

<dependency>
  <groupId>io.vertx</groupId>
  <artifactId>vertx-core</artifactId>
  <version>4.0.0-milestone4</version>
</dependency>

quickstart模块已经介绍了如何去创建一个verticle实例,创建一个类去继承AbstractVerticle,在start方法中创建一个http服务,由verticle实例管理HTTP服务的生命周期。一个verticle就可以看作一个线程。可以创建多个verticle为用户提供服务。

创建Vertx时配置参数

VertxOptions对象使用

VertxOptions的方法都会返回当前VertxOptions对象实例,所以可以像这样进行链式调用。

Vertx vertx = Vertx.vertx(
    new VertxOptions()
    .setWorkerPoolSize(10)
    .setEventBusOptions(
        new EventBusOptions()
    )
);

vertx创建定时任务

每隔delay毫秒执行一次handler方法。

long setPeriodic(long delay, Handler<Long> handler);

delay毫秒后,只执行一次handler方法。

long setTimer(long delay, Handler<Long> handler);

handler方法的参数和setTimer、setPeriodic的返回值是这个定时任务的id,可以通过这个id来开启或取消这个任务。

可以通过cancelTimer方法并传入定时任务的id来取消这个定时任务。

boolean cancelTimer(long id);

Event Bus

可以在event bus发送消息,进行消息通信。

发送的消息类型可以是基本类型、String、Buffer、json。

注册消息地址,第一个参数是注册地址,可通过send方法向这个地址上发送消息。第二个参数是回调参数,接收send方法发送的消息后,handler方法会被执行。

<T> MessageConsumer<T> consumer(String address, Handler<Message<T>> handler);

向地址发送消息

EventBus send(String address, @Nullable Object message);

简单的demo

Vertx vertx = Vertx.vertx();
EventBus eventBus = vertx.eventBus();
// 注册消费者,地址是local.message.address
MessageConsumer<Object> consumer = eventBus.consumer("local.message.address", message -> {
  // 打印消息内容
  logger.info(message.body());
});

/*
 * Vert.x 默认允许任何基本/简单类型、String 或 Buffer 作为消息发送。
 * 不过在 Vert.x 中的通常做法是使用 JSON 格式来发送消息。
 */
// 向local.message.address发送一条字符串消息
eventBus.send("local.message.address", "First Message");

发送buffer,json及自定义对象的例子在github上,可以通过下载源码看见。

注*:如果是junit测试方法,vertx线程不会被阻塞,所以会出现已经向eventbus发送了消息,消息处理端还没接收到消息程序便关闭了。

如果用的是main方法测试,则不会有这个问题。

Buffer

可以通过Buffer.buffer()创建一个buffer对象。这时创建的buffer对象大小默认是0且内容为空,在往buffer里添加内容时buffer会自动扩容。当然也可以指定buffer对象的默认值和默认大小。如果一开始就知道buffer会有一定的内容的话,推荐在一开始便指定buffer的初始值或大小,这样可以避免在添加的时候又动态扩容buffer而造成不必要的资源消耗。

// 指定初始大小
static Buffer buffer(int initialSizeHint);
// 初始值
static Buffer buffer(String string);
// 初始值和编码
static Buffer buffer(String string, String enc);
// 初始内容,用bytes数组表示
static Buffer buffer(byte[] bytes);
// 初始内容用ByteBuf表示
static Buffer buffer(ByteBuf byteBuf);

详细例子请参见BufferDemo测试类

JSON

vert.x内置了json模块,可以方便vert.x程序对json的处理,它内置的json工具类依赖于jackson。

vert.x的JSON模块有两个工具类,JsonObject和JsonArray

通过JsonObject的构造方法可以将字符串、map对象、buffer对象转成json对象

如果要将自定义对象转成json类型,通过JsonObject.mapFrom(Object)方法,需要引入jackson-databind依赖,否则会抛出java.lang.UnsupportedOperationException: Mapping is not available without Jackson Databind on the classpath异常

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.9</version>    
</dependency>

JsonArray对象的用法与JsonObject类似,详细demo参见JsonDemo测试类

参考:https://vertxchina.github.io/vertx-translation-chinese/core/Core.html

猜你喜欢

转载自www.cnblogs.com/dagger9527/p/12286808.html