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. 概述 在之前的文章中说到,一种材质对应一次绘制调用的指令.即使是这种情况,两个三维物体使用同一种材质,但它们使用的材质参数不一样,那么最终仍然会造成两次 ...
随机推荐
- PostgreSQL自学笔记:7 插入、更新与删除数据
7 插入.更新与删除数据 7.1 插入数据 先创建表person: create table person( id int not null, name char(40) not null defau ...
- linux进阶指令
1.df 查看磁盘空间 2.free 查看内存使用 -m 表示以mb位单位查看 total 总大小 used 使用过的空间 free 空闲的空间 shared 共享内存 buffer ...
- angular.isDate()
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Codechef July Challenge 2018 : Subway Ride
传送门 首先(想了很久之后)注意到一个性质:同一条边有多种颜色的话保留3种就可以了,这是因为假如最优解要求当前位置与相邻两条边都不相同,那么只要有3条边,就肯定可以满足这一点. 完事就做一个nlogn ...
- vector, map, queue,set常用总结
#include<bits/stdc++.h> using namespace std; vector<,); 定义一个大小为9,初始化全是1的vector数组 set<int ...
- python多进程使用及线程池的使用方法
多进程:主要运行multiprocessing模块 import os,time import sys from multiprocessing import Process class MyProc ...
- C# 类库中添加注释方法
C# 类库中添加注释方法 C#中新建的类库添加注释时,应注意以下问题: 1.编译动态类库时命名空间要规范,一般不要和类同名,命名空间一般定义格式:项目名+类文件名: 2.动态类库中,类.方法的注释都采 ...
- c++库函数 Map
转载:https://blog.csdn.net/shuzfan/article/details/53115922 C++中map提供的是一种键值对容器,里面的数据都是成对出现的,如下图:每一对中的第 ...
- [daily] emacs显示file name buffer的全路径
在用emacs看代码的时候,在文件间跳来跳去,如果工程太大的话,很可能会有重名文件,这个时候, 你就不知道自己在什么的地方了.需要一个查看当前正在编辑区的文件的名字的方法. emacs在这个地方,存储 ...
- C#即时释放内存
using System;using System.Diagnostics;using System.Runtime.InteropServices; [DllImport("kernel3 ...