上节讲了,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. Android.mk文件语法规范及使用模板 (转载)
  2. AI女神李飞飞:成为顶尖科学家的人生路
  3. java:UDP通信
  4. B - Calculating Function
  5. mysql :The user specified ... does not exist 报错
  6. jacoco统计server端功能测试覆盖率
  7. chgrp和chown命令
  8. 巴伦周刊:“物联网”正走向死胡同
  9. Angular Material 攻略 04 Icon
  10. ioslabel阴影,UILabel的内阴影
  11. php soap详解,关于PHP+SOAP详解
  12. 零氪科技与诺华达成战略合作 共同打造数字化医疗创新模式
  13. vscode中前端vue项目详解_web前端Vue项目实战-Music
  14. Python中函数的形参与按值传递之间的关系
  15. 虎课网腾小渔C4DR21基础入门,OC渲染设置
  16. Ardupilot Pre-Arm安全检查程序分析
  17. linux选was清除缓存,Linux清除缓存操作
  18. OSChina 周五乱弹 —— 源花?真土鳖,我要开源小仙女!
  19. java populate_BeanUtils.populate()的用法
  20. markman高效的设计稿标注、测量工具

热门文章

  1. HZNU2509 曲院风荷——折半搜索
  2. 结对编程java实现四则运算(张铭 吴昊)
  3. python web论坛_十个基于Python的BBS论坛类开源web框架汇总(附源码地址)
  4. python中1 is True 的结果为False,is判断与==判断的区别
  5. jQuery 基础 筛选和遍历 jQuery 对象
  6. 密码库LibTomCrypt学习记录——(1.5)分组密码算法——示例代码AES-ECB
  7. 网页: onkeypress事件与onkeydown事件的区别
  8. Navicat导出数据库表
  9. Revit教程合集110部
  10. 隐藏a标签html,a标签显示隐藏 js怎么控制a标签的显示和隐藏