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. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次 ...
随机推荐
- 取消layUI中日期选择控件默认填充日期
input标签中使用日期选择控件填写,加载时默认填充当前日期, 标签设置了placeholder="请选择" autocomplete="off",但是并没有效 ...
- Python垃圾回收机制--完美讲解!
转自: http://www.jianshu.com/p/1e375fb40506 先来个概述,第二部分的画述才是厉害的. Garbage collection(GC) 现在的高级语言如java,c# ...
- centos安装svn并创建版本库配置用户分组权限
1.设置aliyun安装源// 本步骤非必须, 使用aliyun安装源后, 执行yum update速度明显提升 wget -O /etc/yum.repos.d/CentOS-Base.repo h ...
- ZAB协议与Paxos算法
ZooKeeper并没有直接采用Paxos算法,而是采用一种被称为ZAB(ZooKeeper Atomic Broadcast)的一致性协议 ZooKeeper是一个典型的分布式数据一致性的解决方案, ...
- 8、vue路由跳转 params与query 路由传参
params与query router文件下index.js里面,是这么定义路由的: { path: '/about', name: 'About', component: About } 用quer ...
- jmeter使用指南:jmeter无脑式指南
一:启动jmeter 二:添加线程组 三:添加 HTTP 请求 四:添加监听器 五:填写访问的域名,并保存 六:运行,查看结果 七:配置多线程.循环机制,进行压力测试
- Python学习小纪
1.打包发布*.py文件---"文件路径下打开命令行 d:\python\python.exe setup.py sdist" eg:打包发布f:\C\python\print_l ...
- windows创建定时任务执行python脚本
一.创建定时任务 \ [程序或脚本]文本框中填的是Python编译器的名称,一般就是python.exe, [起始于]文本框中填的是Python编译器的目录,上图中假设你的Python编译器的完整路径 ...
- django的分页与添加图片
分页: 在主页面的views里写接口 导包: from django.core.paginator import Paginator 接口: id=request.GET.get("page ...
- Apache Arrow
https://www.kdnuggets.com/2017/02/apache-arrow-parquet-columnar-data.html https://arrow.apache.org/ ...