源码: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