vert.x 学习笔记
Verticle
一个verticle是部署在Vert.x.单位 每个verticle包含启动它的主要手段。 一个应用程序可以是单个verticle或者可以由与彼此经由事件总线通信的多个verticles的。
Verticles在Vert.x实例中运行。 每个Vert.x实例在其自己的JVM实例运行,并且可以承载多个verticles。 一个Vert.x实例确保verticles彼此通过运行每个在其自己的类加载器分离,所以没有修改一个静态变量是另一个实例的风险。 主机可以运行一个单一的Vert.x实例或多个的。
一个Vert.x实例,保证每个verticle实例总是在同一个线程执行。 并发Vert.x 是单线程的。
在内部,Vert.x实例维护一组线程(通常为CPU核心数)是在执行一个事件循环 :检查,看看是否有工作要做,做到这一点,去睡觉。
Verticles通过使用事件总线传递消息通信。
虽然你可能会认为,共享数据和可扩展性截然相反。 Vert.x提供了一个共享的MAP和跨在同一Vert.x实例中运行verticles传递不可改变的数据共享一套设施,这时候数据是可变的唯一真正的 。
Vert.x使用相对较少的线程来创建一个事件循环和执行verticles。 但在某些情况下,需要verticle做一些要么昂贵计算,或可能阻塞,如连接到数据库。 当发生这种情况Vert.x可以让你标记verticle实例作为worker verticle 。Vert.x确保worker verticles将永远不会被同时执行,所以要他们保持在最低水平,但他们在那里帮助你,当你需要他们,在这种情况下,将由后台执行的线程池执行。
Verticle
1,标准Verticle
这是最常见的一种,它是由一个event loop 线程来执行。它被创建的时候分分配到一个event loop线程,并使用这个线程调用它的start方法。它保证在这个实例中执行的代码都是在同一个event loop线程中执行。
2,Worker Verticles
它使用worker 线程池中的一个线程执行,一个实例自始至终都是使用同一个线程执行。类似于标准Verticles,但是使用的是worker 线程池,它一般用来执行那些有阻塞的代码,比如网络请求,数据库请求,文件创建等等,这样它就不会阻塞event loop线程了。可以像下面这样创建一个worker Verticles
DeploymentOptions options = new DeploymentOptions().setWorker(true);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
3,多线程Worker Verticles
它也是使用wroker线程池中的一个线程执行,一个实现可以使用多个线程同时执行。它需要用户自己保证每个Verticles的并发安全性。Vertx的客户端和服务端不能在这里面创建,要不然它会抛出一个异常。
部署一个Verticles
Verticle myVerticle = new MyVerticle();
vertx.deployVerticle(myVerticle);
使用Json传入配置
JsonObject config = new JsonObject().put("name", "tim").put("directory", "/blah");
DeploymentOptions options = new DeploymentOptions().setConfig(config);
vertx.deployVerticle("com.mycompany.MyOrderProcessorVerticle", options);
Context
获取Context
Context context = vertx.getOrCreateContext();
判断Context的类型
Context context = vertx.getOrCreateContext();
if (context.isEventLoopContext()) {
System.out.println("Context attached to Event Loop");
} else if (context.isWorkerContext()) {
System.out.println("Context attached to Worker Thread");
} else if (context.isMultiThreadedWorkerContext()) {
System.out.println("Context attached to Worker Thread - multi threaded worker");
} else if (! Context.isOnVertxThread()) {
System.out.println("Context not attached to a thread managed by vert.x");
}
Context中加入共享数据
final Context context = vertx.getOrCreateContext();
context.put("data", "hello");
context.runOnContext((v) -> {
String hello = context.get("data");
});
定时
执行一次
long timerID = vertx.setTimer(1000, id -> {
System.out.println("And one second later this is printed");
});
System.out.println("First this is printed");
执行多次
long timerID = vertx.setPeriodic(1000, id -> {
System.out.println("And every second this is printed");
});
System.out.println("First this is printed");
在执行多次任务时,如果间隔时间太短,而任务执行的时间又太长,并不会阻止定时器的运行。建议可以使用执行一次,成功之后再添加执行一次。
Event Bus
它是整个系统的神经网络,用于不同模块数据之间的交互,有publish/subscribe, point-to-point, and request-response messaging.
如果发送消息之后希望接收返回消息,可以使用下面的方式:
发送者:
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());
}
});
接收者:
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!");
});
vert.x 学习笔记的更多相关文章
- vert.x学习(八),用JDBCClient配合c3p0操作数据库
今天学习了下vert.x的JDBCClient,我这里将今天的学习笔记记录下来.这次学习中使用了c3p0. 用使用JDBCClient和c3p0得现在pom.xml文件里面导入对应的依赖,下面贴出xm ...
- vert.x学习(一),开篇之hello world
今天决定学习下vert.x这个框架,记录下学习笔记. 下面列下我的开发环境: Java版本 1.8 maven版本 3.3 IDEA版本 2016 在idea中使用vert.x不用下载或安装其他东西了 ...
- 【Unity Shaders】学习笔记——SurfaceShader(十一)光照模型
[Unity Shaders]学习笔记——SurfaceShader(十一)光照模型 转载请注明出处:http://www.cnblogs.com/-867259206/p/5664792.html ...
- Unity3D 骨骼动画原理学习笔记
最近研究了一下游戏中模型的骨骼动画的原理,做一个学习笔记,便于大家共同学习探讨. ps:最近改bug改的要死要活,博客写的吭哧吭哧的~ 首先列出学习参考的前人的文章,本文较多的参考了其中的表述: 1. ...
- Shader学习笔记
Shader学习笔记 例子: Shader "SrfShader1"{ //定义显示在Inspector中的变量,并从Inspector中获取值 Properties{ _Colo ...
- matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色
一起来学matlab-matlab学习笔记9 高级绘图命令_2 图形的高级控制_视点控制和图形旋转_色图和颜色映像_光照和着色 觉得有用的话,欢迎一起讨论相互学习~Follow Me 参考书籍 < ...
- Unity Shader学习笔记-1
本篇文章是对Unity Shader入门精要的学习笔记,插图大部分来自冯乐乐女神的github 如果有什么说的不正确的请批评指正 目录 渲染流水线 流程图 Shader作用 屏幕映射 三角形遍历 两大 ...
- Unity3D学习笔记3——Unity Shader的初步使用
目录 1. 概述 2. 详论 2.1. 创建材质 2.2. 着色器 2.2.1. 名称 2.2.2. 属性 2.2.3. SubShader 2.2.3.1. 标签(Tags) 2.2.3.2. 渲染 ...
- Unity3D学习笔记6——GPU实例化(1)
目录 1. 概述 2. 详论 3. 参考 1. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次 ...
随机推荐
- Android 控件
1. WebView <uses-permission android:name="android.permission.INTERNET" /> WebView wv ...
- java @Override 报错解决
有时候Java的Eclipse工程换一台电脑后编译总是@override报错,把@override去掉就好了,但不能从根本上解决问题,因为有时候有@override的地方超级多. 这是jdk的问题,@ ...
- Ubuntu安装并使用sogou输入法
1.下载搜狗输入法的安装包 下载地址为:http://pinyin.sogou.com/linux/ ,如下图,要选择与自己系统位数一致的安装包,我的系统是64位,所以我下载64位的安装包 2.按键C ...
- JS编码方式
1. escape(): 采用unicode字符集对指定的字符串除0-255以外进行编码.所有的空格符.标点符号.特殊字符以及更多有联系非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符 ...
- getsockopt和setsockopt函数
在Unix网络编程中通常用到getsockopt和setsockopt两个函数来获取和设置套接口的选项. getsockopt()函数用于获取任意类型.任意状态套接口的选项当前值,并把结果存入optv ...
- 2019.4.1 JMeter中文乱码解决方案
1)添加一个HTTP信息头管理器:添加Accept:application/xml;application/json;charset=utf-8 2)参数为中文:在HTTP请求时设置编码格式为utf- ...
- PHP 多个构造函数
class A { function __construct() { $a = func_get_args(); $i = func_num_args(); if (method_exists($th ...
- python learning day01
python简介 一.python的由来: python的创始人是吉多·范罗苏姆(Guido van Rossum).1989年的圣诞节期间,吉多·范罗苏姆为了在阿姆斯特丹打发时间,决心开发一个新的脚 ...
- 我喜欢的几款不错的vim插件
插件安装组件 https://github.com/tpope/vim-pathogen supertab自动补齐 https://www.vim.org/scripts/script.php?scr ...
- [vue]vue基础复习项案例stepbystep
看本篇第二次复习内容即可. 还有一些 文档了这个如 https://www.cnblogs.com/iiiiiher/p/9508733.html https://www.cnblogs.com/ii ...