Verticle in Vert.x
上节讲了,Verticle实例有start()和stop()方法,你可以在这两个方法中实现具体工作然后将实例注册到Vertx实例中将自动调用这两个方法。verticle有些类似Servlet或者JavaEE中事件驱动的EJB,但是要实现并发处理,verticle的工作模式与前两者并不同。本节将介绍如何注册verticle到vertx以及verticle内部之间如何通过eventbus互相通信。
创建Verticle
首先创建一个继承自io.vertx.core.AbstractVerticle的类:
import io.vertx.core.AbstractVerticle;public class BasicVerticle extends AbstractVerticle {}
你已经创建了一个BasicVerticle类,但是它还不包含任何方法,下面添加start()和stop()方法。
start()
AbstractVerticle类包含了start()方法,你可以override它并在里面添加你想让它去做的工作,如:
public class BasicVerticle extends AbstractVerticle {@Overridepublic void start() throws Exception {System.out.println("BasicVerticle started");}
}
这里只是打印了一串字符。原则上start()里面可以做任何它应当做的事情,比如initialize当前verticle、创建一个HTTP或TCP Server、给EventBus注册Event Handlers、或者注册其它Verticle实例到Vertx实例等。
start()方法还有另外一个用法,那就是传递一个Future对象的参数,如:
public class BasicVerticle extends AbstractVerticle {@Overridepublic void start(Future future) throws Exception {System.out.println("BasicVerticle started");}
}
Future对象参数可以用来异步的告诉Vertx实例是否此次注册verticle成功了。
stop()
stop()方法在vertx实例停止的时候或者当verticle被从vertx实例卸载的时候。下面是在自己类中对它的覆盖:
public class BasicVerticle extends AbstractVerticle {@Overridepublic void start() throws Exception {System.out.println("BasicVerticle started");}@Overridepublic void stop() throws Exception {System.out.println("BasicVerticle stopped");}
}
Deploy Verticle
创建完成自己的Verticle类BasicVerticle之后,就可以注册它到Vert.x实例中了:
public class VertxVerticleMain {public static void main(String[] args) throws InterruptedException {Vertx vertx = Vertx.vertx();vertx.deployVerticle(new BasicVerticle());}
}
需要注意两点:第一,当vertx.deployVerticle(new BasicVerticle());执行时,Verticle的start()方法将会被调用;第二,vertx.deployVerticle()方法是异步将Verticle实例配置(注册),所以当该方法返回时,可能并没有注册完成,要想确切的知道何时被成功注册了,你可以通过提供一个Handler完成,如:
vertx.deployVerticle(new BasicVerticle(), new Handler<AsyncResult<String>>() {@Overridepublic void handle(AsyncResult<String> stringAsyncResult) {System.out.println("BasicVerticle deployment complete");}});
或者使用Java中的lambda表达式:
vertx.deployVerticle(new BasicVerticle(), stringAsyncResult -> {System.out.println("BasicVerticle deployment complete");
});
从别的Verticle中注册其它的Verticle
可以在一个verticle内部注册其它的verticle,比如:
public class BasicVerticle extends AbstractVerticle {@Overridepublic void start() throws Exception {System.out.println("BasicVerticle started");vertx.deployVerticle(new SecondVerticle());}@Overridepublic void stop() throws Exception {System.out.println("BasicVerticle stopped");}
}
请读者自行体会这样做会带来程序业务逻辑上的层次流程关系。
使用Event Bus
verticle可以监听到来自Event bus的消息,也可以给Event bus写消息。
监听消息
verticle监听来自Event bus的消息,是通过一个自定义的“Address”实现的,该“Address”是可以随意定义的一个字符串名称。
多个verticles可以监听同一个“Address”的消息,也可以给同一个“Address”发送消息。
public class MyVerticle extends AbstractVerticle {public void start(Future<Void> startFuture) {vertx.eventBus().consumer("anAddress", message -> {System.out.println("1 received message.body() = "+ message.body());});}
}
我们在start()中让MyVerticle监听来自Event Bus的anAddress地址的消息。
发送消息
给Event bus发送消息可以通过send()或publish()完成。
publish()方法发送的消息会被监听在该地址的所有verticle接收,注意是所有。
send()方法发送的消息只会被监听在该地址的其中一个verticle接收,到底哪个接收由vertx决定,vertx怎么决定的呢?官方解释是通过“non-strict round robin”原则,简单理解就是按照不严格的规则随机的选择一个verticle收到该消息。请读者自己琢磨send()这种方式的好处。
Vertx vertx = Vertx.vertx();vertx.deployVerticle(new EventBusReceiverVerticle("R1"));
vertx.deployVerticle(new EventBusReceiverVerticle("R2"));Thread.sleep(3000);
vertx.deployVerticle(new EventBusSenderVerticle());
public class EventBusSenderVerticle extends AbstractVerticle {public void start(Future<Void> startFuture) {vertx.eventBus().publish("anAddress", "message 2");vertx.eventBus().send ("anAddress", "message 1");}
}
public class EventBusReceiverVerticle extends AbstractVerticle {private String name = null;public EventBusReceiverVerticle(String name) {this.name = name;}public void start(Future<Void> startFuture) {vertx.eventBus().consumer("anAddress", message -> {System.out.println(this.name + " received message: " +message.body());});}
}
运行以上代码,你将会看到message 2会被两个verticle接收到,而message 1只会被其中一个接收。
Verticle in Vert.x相关推荐
- Vert.x ——概述
Vert.x是什么 Vert.x(http://vertx.io/)是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构. Vert.x框架基于事件和异步,依托 ...
- vert.x详细介绍,全异步框架
Vert.x是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构.Vert.x基于全异步Java服务器Netty,并扩展出了很多有用的特性 github: h ...
- 使用vert.x发布restful接口
使用vert.x发布restful接口 原文及更多文章请见个人博客:http://heartlifes.com vert.x重要概念介绍: 在第2偏笔记中,我们写了第一个vert.x的hello wo ...
- Vert.x架构简述
Vert.x 简介 Vert.x是一个工具集,用来在JVM上构建反应式应用.反应式的应用能够随着负载的增加而伸缩,也能够在故障中保持灵活. 传统的实现方式面临的问题 传统的实现高并发的方式是很多的线程 ...
- Vert.x实战 Verticles:Vert.x的基本处理单元
本章包括: verticles是什么 如何写[write].配置[configure]以及部署[deploy]一个verticles Vert.x的线程模型[threading model] 如何混合 ...
- Vert.x 学习笔记
一.概述 Vert.x(http://vertx.io)是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构. Vert.x是基于大名鼎鼎netty的异步的工具 ...
- Vert.x简介、原理与HelloWorld
Vert.x 简介 官方文档 http://vertx.io/docs/vertx-core/java/ 关于Vert.x Vertx,是一个基于JVM.轻量级.高性能的应用平台,非常适用于移动端后台 ...
- vert.x笔记:3.使用vert.x发布restful接口
原文及更多文章请见个人博客:http://heartlifes.com vert.x重要概念介绍: 在第2偏笔记中,我们写了第一个vert.x的hello world代码,这里,我们把代码中用到的几个 ...
- Java的HTTP服务端响应式编程
传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...
最新文章
- oracle 条件动态视图,oracle最重要的9个动态性能视图
- JavaScript 原型继承
- unity3d鼠标拖拽模型,旋转模型
- 【中文模板】Latex如何写中文文档
- 生产环境子域降级记录
- Matlab 学习笔记
- 【javascript】js检验注册密码强度效果
- proxool,好东西
- [翻译svg教程]Path元素 svg中最神奇的元素!
- Android短信页面
- 迷宫最短路径-货郎担问题的解决思路
- 解决Maven下载慢的问题
- case 在oracle和mysql_Mysql oracle casewhen 完美应用
- MDK与keilC51共存的方法
- select into 时有无strict关键字的区别
- JavaScript实现Sleep效果
- 让博客Docker化,轻松上手Docker
- java玫瑰花代码_教小白用Html代码做玫瑰花
- Javascript特效:点名册(随机点名)
- Word怎样设置处理表格与表格标题之间的间距问题
热门文章
- Python 3.X 用Thinker做任意多边形的缩放图(一)
- java对象头 MarkWord
- JMS(Java Messaging Service)基础
- 为什么你觉得信用卡负担越来越重了?那是你不会技巧!
- 并发用户数,吞吐量计算公式
- Python Scrapy 爬虫 - 爬取多级别的页面
- 大数据与机器学习-大数据预测
- D3D初学入门一(配置开发环境及绘制D3D窗口)
- Outlook2007备份邮件规则、联系人以及账号及在Outlook 2007中删除自动记忆的收件人...
- html5 原生插件,前端必备插件之纯原生JS的瀑布流插件Macy.js