上节讲了,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相关推荐

  1. Vert.x ——概述

    Vert.x是什么 Vert.x(http://vertx.io/)是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构. Vert.x框架基于事件和异步,依托 ...

  2. vert.x详细介绍,全异步框架

    Vert.x是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构.Vert.x基于全异步Java服务器Netty,并扩展出了很多有用的特性 github:  h ...

  3. 使用vert.x发布restful接口

    使用vert.x发布restful接口 原文及更多文章请见个人博客:http://heartlifes.com vert.x重要概念介绍: 在第2偏笔记中,我们写了第一个vert.x的hello wo ...

  4. Vert.x架构简述

    Vert.x 简介 Vert.x是一个工具集,用来在JVM上构建反应式应用.反应式的应用能够随着负载的增加而伸缩,也能够在故障中保持灵活. 传统的实现方式面临的问题 传统的实现高并发的方式是很多的线程 ...

  5. Vert.x实战 Verticles:Vert.x的基本处理单元

    本章包括: verticles是什么 如何写[write].配置[configure]以及部署[deploy]一个verticles Vert.x的线程模型[threading model] 如何混合 ...

  6. Vert.x 学习笔记

    一.概述 Vert.x(http://vertx.io)是一个基于JVM.轻量级.高性能的应用平台,非常适用于最新的移动端后台.互联网.企业应用架构. Vert.x是基于大名鼎鼎netty的异步的工具 ...

  7. Vert.x简介、原理与HelloWorld

    Vert.x 简介 官方文档 http://vertx.io/docs/vertx-core/java/ 关于Vert.x Vertx,是一个基于JVM.轻量级.高性能的应用平台,非常适用于移动端后台 ...

  8. vert.x笔记:3.使用vert.x发布restful接口

    原文及更多文章请见个人博客:http://heartlifes.com vert.x重要概念介绍: 在第2偏笔记中,我们写了第一个vert.x的hello world代码,这里,我们把代码中用到的几个 ...

  9. Java的HTTP服务端响应式编程

    传统的Servlet模型走到了尽头 传统的Java服务器编程遵循的是J2EE的Servlet规范,是一种基于线程的模型:每一次http请求都由一个线程来处理. 线程模型的缺陷在于,每一条线程都要自行处 ...

最新文章

  1. oracle 条件动态视图,oracle最重要的9个动态性能视图
  2. JavaScript 原型继承
  3. unity3d鼠标拖拽模型,旋转模型
  4. 【中文模板】Latex如何写中文文档
  5. 生产环境子域降级记录
  6. Matlab 学习笔记
  7. 【javascript】js检验注册密码强度效果
  8. proxool,好东西
  9. [翻译svg教程]Path元素 svg中最神奇的元素!
  10. Android短信页面
  11. 迷宫最短路径-货郎担问题的解决思路
  12. 解决Maven下载慢的问题
  13. case 在oracle和mysql_Mysql oracle casewhen 完美应用
  14. MDK与keilC51共存的方法
  15. select into 时有无strict关键字的区别
  16. JavaScript实现Sleep效果
  17. 让博客Docker化,轻松上手Docker
  18. java玫瑰花代码_教小白用Html代码做玫瑰花
  19. Javascript特效:点名册(随机点名)
  20. Word怎样设置处理表格与表格标题之间的间距问题

热门文章

  1. Python 3.X 用Thinker做任意多边形的缩放图(一)
  2. java对象头 MarkWord
  3. JMS(Java Messaging Service)基础
  4. 为什么你觉得信用卡负担越来越重了?那是你不会技巧!
  5. 并发用户数,吞吐量计算公式
  6. Python Scrapy 爬虫 - 爬取多级别的页面
  7. 大数据与机器学习-大数据预测
  8. D3D初学入门一(配置开发环境及绘制D3D窗口)
  9. Outlook2007备份邮件规则、联系人以及账号及在Outlook 2007中删除自动记忆的收件人...
  10. html5 原生插件,前端必备插件之纯原生JS的瀑布流插件Macy.js