Vert.x中EventBus中的使用
注意:使用的是vert.x3.0 仅支持到java8当中有一些lambda表达式。如不明确请自补java8新特性。
The Event Bus
event bus 是vert.x的神经系统。
每个vert.x的实例都有一个单一的event bus 实例。它是使用vertx.eventBus()方法获得的。
event bus 同意程序中的不同语言编写的模块进行通信。不论他们是同样的vert.x实例。还是不同的vert.x实例。
它甚至能够桥接浏览器中执行的Javascript通信。
event bus能够在分布式系统中的多个server节点之间进行点对点通信和多个浏览器。
event bus支持公布/订阅模式。点对点模式,和请求/响应模式。
event bus的API是很easy的。它主要包含注冊消息处理事件。取消处理事件。发送和公布消息。
首先理论
寻址
event bus上的消息被发送到一个地址。
vert.x不包括不论什么花哨的寻址方案。
在vert.x中,一个地址就是一个简单的String字符串。不论什么字符串都是有效的。只是最好的方法是使用某种有计划或者有规则的方案,比方使用一个私有的空间名称。
一些有參考价值的样例:europe.news.feed1,
acme.games.pacman, sausages, and X。
事件-消息的处理程序
收到消息的处理程序,你在一个地址上注冊一个处理程序,来消息后将触发这个处理程序。
同一个消息处理程序能够注冊到不同的地址上,相同同一个地址也能注冊多个处理程序。
公布/订阅模式
event bus 支持公布消息
消息被公布到一个地址。公布意味着将消息交给全部订阅并注冊处理程序的地址来处理。
这跟大家熟悉的公布/订阅模式没有什么不同。
点对点和请求/响应模式
event bus 支持点对点消息传递。
消息被发送到一个地址。
vert.x将发送它到一个注冊消息处理程序的地址。
假设有多个处理程序注冊地址,vert.x将选择一个来处理(採用非严格循环算法)。
强烈不推荐。
当接收到消息的程序处理完毕后,能够决定是否回复。发送程序接到回复后也能够进行响应回复,假设他们这样做应答处理程序将被调用。
当接收方到返回发送方。这样能够无限反复,这又是一种常见的消息传递模式:请求/响应模式
最优传输
vert.x可以做到最优传输。不会有意识的丢失消息。这是很重要的。
然而,event bus的部分或所有失败还是有可能造成消息丢失的。
假设你的应用程序很在乎消息的完整性和时序性。那么你的代码处理应该是幂等的。以便在消息处理程序复苏后又一次发送消息。
消息类型
开箱同意vert.x使用不论什么的原始/简单类型,字符串或者缓冲区发送消息。
然而这里有一个不成文的规定或者说建议。那就是最好使用JSON格式的子串来进行消息的传递。
JSON字串在全部的编程语言中都是很easy创建。读取和解析的。在vert.x下它已经变成一种通用语言了。
假设你不是必需使用JSON或者说你不想。
event bus 很灵活。
它还支持发送随意对象。还能够定义您想要发送的对象的编解码器。
EVENT BUS 的API
让我们跳进event bus的API。
获得event bus 的对象
你能够通过例如以下代码获得event bus的单一对象:
EventBus
eb = vertx.eventBus();
注冊处理事件
使用以下这个简单方法注冊一个消费处理程序:
EventBus
eb = vertx.eventBus();
eb.consumer("news.uk.sport", message -> {
System.out.println("I have received a message: " + message.body());
});
当一个消息到达你的处理事件是。你的事件将被激活。并处理这个消息。
consumer()方法返回一个MessageConsumer的对象实例。这个对象随后用于注销处理程序,或者用处理程序作为流。
然而您也能够使用consumer()返回MessageConsumer没有处理程序,然后单独设置处理程序。比如:
EventBus
eb = vertx.eventBus();
MessageConsumer<String> consumer = eb.consumer("news.uk.sport");consumer.handler(message
-> {
System.out.println("I have received a message: " + message.body());
});
当在集群事件总线上注冊一个处理程序时,它能够花一些时间登记到集群的全部节点上。
假设你希望在注冊完毕时得到通知的话,你能够在MessageConsumer上注冊一个注冊完毕的处理程序:
consumer.completionHandler(res
-> {
if (res.succeeded()) {
System.out.println("The handler registration has reached all
nodes");
} else {
System.out.println("Registration failed!");
}
});
注销处理事件
去除处理事件。叫做注销。
假设你是集群事件总线, 假设你想当这个过程完毕时通知注销,你能够使用以下的方法:
consumer.unregister(res
-> {
if (res.succeeded()) {
System.out.println("The handler un-registration has reached
all nodes");
} else {
System.out.println("Un-registration failed!");
}
});
公布消息
公布消息很easy。仅仅须要把它公布到指定地址就可以:
eventBus.publish("news.uk.sport",
"Yay! Someone kicked a ball");
这一消息将被交付全部订阅news.uk.sport地址处理。
发送消息
发送消息将导致仅仅有一个注冊地址的处理程序接收到消息(多个注冊地址也仅仅有一个能收到)。
这就是点对点模式,选择处理程序的方法採用非严格循环方式。
你可用用send()方法发送一条消息。
eventBus.send("news.uk.sport",
"Yay! Someone kicked a ball");
未解决的指令包含在<stdiin>-include::override/eventbus_headers.adoc[]
==== The Message object
你的消息处理程序收到的是一个Message。
消息的body相应着是应该发送还是应该公布。
消息的headers是可用的。
回复消息
有时你发送消息后希望得到接收到消息的人的回复。
这就须要你使用请求-响应模式。
要做到这一点,在消息发送的时候,你能够指定一个回复事件。
当你接收到消息的时候,你能够通过调用reply()方法来应答。
当这一切发生的时候它会导致一个答复发送回发送方,发送方收到应答消息再做处理。
接收方:
MessageConsumer<String> consumer = eventBus.consumer("news.uk.sport");
consumer.handler(message -> {
System.out.println("I have received a message: " + message.body());
message.reply("how interesting!");
});
发送方:
eventBus.send("news.uk.sport", "Yay! Someone kicked a ball across a patch of grass", ar -> {
if (ar.succeeded()) {
System.out.println("Received reply: " + ar.result().body());
}
});
相应答也能够做应答。这样你就能够在两个不同的程序中创建一个包括多个回合的对话。
发送超时
当你发送消息时和指定应答事件时你能够通过DeliveryOptions指定超时时间。
假设应答事件不少于超时时间,这个应答事件将失败。
默认的超时时间是30S。
发送失败
消息发送失败的其它原因,包含:
没有可用的事件去发送消息
接收者已经明白使用失败:失败的消息
在全部情况下。应答事件将回复特定的失败。
未解决的指令包括在<stdin> - include::override/eventbus.adoc[]==== Clustered Event Bus
event bus 不只存在于一个单一的Vert.x实例中,在一个集群中不同的Vert.x实例也能够形成一个单一的,分布的事件总线。
集群编程
假设你创建一个Vert.x实例用于集群编程。你须要的得到一个关于集群事件总线配置
VertxOptions options = new VertxOptions();
Vertx.clusteredVertx(options, res -> {
if (res.succeeded()) {
Vertx vertx = res.result();
EventBus eventBus = vertx.eventBus();
System.out.println("We now have a clustered event bus: " + eventBus);
} else {
System.out.println("Failed: " + res.cause());
}});
你应该确保在你的类路径中实现了一个ClusterManager,比如默认的:HazelcastClusterManager。
使用命令集群
你能够使用命令行执行集群:vertx
run my-verticle.js -cluster
Automatic
clean-up in verticles
If you’re registering event bus handlers from inside verticles, those handlers
will be automatically unregisteredwhen the verticle is undeployed.
Vert.x中EventBus中的使用的更多相关文章
- EventBus中观察者模式的应用
一 介绍 EventBus是一款安卓的开源消息传递框架,地址:https://github.com/greenrobot/EventBus android系统的消息传递非常复杂,比如activity和 ...
- vue中eventbus的使用
eventbus的方法很是简单,我们需要做三步事情: 第一步,我们需要创造一个容器去充当我们的eventbus 第二步,我们需要去抛出,或者说提交我们的事件 第三步,我们去监听我们的那个事件(也许这才 ...
- Firebug中调试中的js脚本中中文内容显示为乱码
Firebug中调试中的js脚本中中文内容显示为乱码 设置 页面 UFT-8 编码没用, 解决方法:点击 "Firebug"工具栏 中的"选项"---" ...
- C#中DataTable中的Compute方法使用收集
原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...
- js中== 和===中的区别
<!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <m ...
- win7中VS2010中安装CSS3.0问题解决方法
win7中VS2010中安装CSS3.0问题解决方法 在安装Standards Update for VS2010 SP1后,VS2010中没有CSS3.0问题,以下是我的解决方法 1.首先去官网 ...
- cocos2dx常见的46中+22中动作详解
cocos2dx常见的46中+22中动作详解 分类: iOS2013-10-16 00:44 1429人阅读 评论(0) 收藏 举报 bool HelloWorld::init(){ ///// ...
- Nhibernate中 Many-To-One 中lazy="proxy" 延迟不起作用的原因
2010-07-15 12:10 by 彭白洋, 322 阅读, 0 评论, 收藏, 编辑 NHibernate中 Many-To-One 中lazy="proxy" 延迟不起作用 ...
- IOS获取物理尺寸中7Plus中获取的是7的物理尺寸
IOS获取物理尺寸中7Plus中获取的是7的物理尺寸: 在开发调试过程中我的7Plus手机获取[uiscreen mainscreen].bounds为750 .1334. 解决方案:在手机中的显示 ...
随机推荐
- Python编程 - json字符串的解析
import json jsonString = '{"arrayOfNums":[{"number":0},{"number":1},{& ...
- LoadRunner Controller: 压力机
前提条件 1. 压力机所在的机器上装了LR agent ,并启用了. 运行下图所示程序,即可启动.启动之后状态栏会出现卫星小图标 2. Controller所在机器的RPC服务开启. 打开运行 –&g ...
- JSTL详解(二)
JSTL详解(二) 在JSTL中,一般用途的标签只要是指具有输出,设置变量,和错误处理等功能的标签,他们在jsp中使用很频繁,它们有: l <c:out> l ...
- 解决pl/sql 查询数据中文显示成?
解决方法: 1.打开 PLSQL Developer 安装目录下,看到有PLSQLDev.exe的目录, 在PLSQL Developer文件夹内新建“PLSql_run.bat”文件,在该文件中输入 ...
- UVA 357 Let Me Count The Ways(全然背包)
UVA 357 Let Me Count The Ways(全然背包) http://uva.onlinejudge.org/index.php?option=com_onlinejudge& ...
- 算法笔记_109:第四届蓝桥杯软件类省赛真题(JAVA软件开发本科B组部分习题)试题解答
目录 1 马虎的算式 2 黄金连分数 3 有理数类 4 幸运数 5 连号区间数 前言:以下试题解答代码部分仅供参考,若有不当之处,还请路过的同学提醒一下~ 1 马虎的算式 标题: 马虎的算式 小明 ...
- PHP 循环
PHP 中的循环语句用于执行相同的代码块指定的次数. 循环 在您编写代码时,您经常需要让相同的代码块运行很多次.您可以在代码中使用循环语句来完成这个任务. 在 PHP 中,我们可以使用下列循环语句: ...
- 解决win10锁屏后无法进入桌面
方法一: TAKEOWN /F "%SystemRoot%\System32\InputMethod\CHS\ChsIME.exe" icacls "%SystemRoo ...
- Web 应用性能提升的 10 个建议
建议一.利用反向代理服务器加速和保护应用 如果 Web 应用运行在一台独立的电脑上,性能问题的解决方案是显而易见的:换一台更快的电脑,里面加上更多的处理器.内存.快速磁盘阵列等等.然后在这台新电脑上运 ...
- Divisibility by Eight
把当前数删除几位然后能够整除与8 那么可得知大于3位数的推断能否整除于八的条件是(n%1000)%8==0 能够得出我们的结论:仅仅须要枚举后三位后两位后一位就可以知道是否可整除于8 #include ...