vertx核心类之VertxImpl
在Vert.x中,Vertx接口是最为重要的一个接口,vertx-core的基础功能都在此接口中提供。这篇文章中我们就来分析一下Vertx接口体系的内部实现以及创建流程。本文对应Vert.x的版本为 3.2.1。
Vertx接口体系
我们来看一下Vertx接口的UML关系:
可以看到有VertxImpl <:< VertxInternal <:< Vertx这个继承链。这里我们先不研究Measured和MetricsProvider这两个接口。我们先来看一下VertxInternal的结构:
可以看到里边包含了各种操作多线程、执行回调等等的方法。VertxInternal接口仅供vertx-core内部调用。
VertxImpl类是对VertxInternal和Vertx接口的实现。我们创建的Vertx实例都是VertxImpl。
Vertx创建流程以及内部实现
通常,我们都会通过Vertx接口中的静态方法vertx创建Vertx实例:
1 |
Vertx vertx = Vertx.vertx(); |
vertx方法底层通过工厂模式创建VertxImpl实例:
1 |
static Vertx vertx() {
|
1 |
public class VertxFactoryImpl implements VertxFactory {
@Override
|
下面我们来探究一下VertxImpl类的创建流程和内部实现。我们首先来看一下VertxImpl类的实例成员:
1 |
private final FileSystem fileSystem = getFileSystem(); |
这里面包含了一系列重要的类。我们将在初始化部分来分析这些成员的作用。下面我们来看一下构造函数:
1 |
VertxImpl() {
|
可以看到最终都会调用到VertxImpl(VertxOptions options, Handler<AsyncResult<Vertx>> resultHandler)这个构造函数,下面我们就来分析一下。
首先,Vertx会检查当前是否有Vertx实例运行(通过factory.context()方法)。如果有实例运行的话就会给出警告。
1 |
// Sanity check |
接着Vertx会初始化checker成员,它是一个BlockedThreadChecker,作用是检查vertx context中是否有阻塞的线程,如果有线程阻塞则给出警告。
1 |
checker = new BlockedThreadChecker(options.getBlockedThreadCheckInterval(), options.getMaxEventLoopExecuteTime(), |
接下来,Vertx会初始化EventLoop线程工厂eventLoopThreadFactory,它用于产生EventLoop线程。然后初始化eventLoopGroup并进行配置。NioEventLoopGroup是Netty里的概念,将在稍后进行介绍。
1 |
eventLoopThreadFactory = new VertxThreadFactory("vert.x-eventloop-thread-", checker, false);
|
接下来,Vertx会初始化Acceptor EventLoop线程工厂,并对其进行配置。然后对workerPool和internalBlockingPool这两个线程池进行初始化。其中workerPool用于执行worker线程,internalBlockingPool用于执行阻塞操作线程。
1 |
ThreadFactory acceptorEventLoopThreadFactory = new VertxThreadFactory("vert.x-acceptor-thread-", checker, false);
|
然后,Vertx会初始化两个线程池工厂workerOrderedFact和internalOrderedFact,它们的类型是OrderedExecutorFactory,里边包含一种能够按照次序执行线程的线程池。
1 |
workerOrderedFact = new OrderedExecutorFactory(workerPool); |
接下来,Vertx会依次对文件解析器fileResolver、部署管理器deploymentManager、SPI管理器metrics进行初始化,并且根据配置来决定是否初始化集群管理器clusterManager和高可用管理器haManager。然后Vertx会调用createAndStartEventBus(options, resultHandler)方法,创建并启动EventBus。最后对共享数据成员sharedData进行初始化。
1 |
this.fileResolver = new FileResolver(this); |
经过一系列的构造后,VertxImpl创建完成。
以上。
以下为链接:
来自vertx中国用户组,
(不同版本,代码可能有少许不同之处(我目前使用的是3.3.2),但不妨碍阅读和理解)
http://mp.weixin.qq.com/s?__biz=MzA4MjUwNzQ0NQ==&mid=2650547613&idx=1&sn=5435d20496e4c9f57d958a45855f9f59&chksm=878c2647b0fbaf51bb8a937c2468117a159e2e0acc8a5bf4ba6404b6282d1f6fd1241f01de25&mpshare=1&scene=23&srcid=1206gxIsVTqNU9B885NQYJzL#rd
vertx核心类之VertxImpl的更多相关文章
- cesium核心类Viewer简介
1.简单描述Viewer Viewer类是cesium的核心类,是地图可视化展示的主窗口,cesium程序应用的切入口,扮演必不可少的核心角色. 官网的英文解析如下: A base widget fo ...
- Webwork 学习之路【03】核心类 ServletDispatcher 的初始化
1. Webwork 与 Xwork 搭建环境需要的的jar 为:webwork-core-1.0.jar,xwork-1.0.jar,搭建webwork 需要xwork 的jar呢?原因是这样的,W ...
- Hibernate核心类用法-使用Transaction管理事务
一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据 ...
- 理解Lucene索引与搜索过程中的核心类
理解索引过程中的核心类 执行简单索引的时候需要用的类有: IndexWriter.Directory.Analyzer.Document.Field 1.IndexWriter IndexWr ...
- android的消息处理有三个核心类:Looper,Handler和Message。
android的消息处理机制(图+源码分析)——Looper,Handler,Message 作为 一名android程序员,我学习android的一大乐趣是可以通过源码学习google大牛们的设 ...
- codeigniter框架扩展核心类---实现前台后台视图的分离
1. 扩展核心类,主要作用就是扩展系统现在的功能. 为前台增加独立的视图文件夹: a. 自定义路径常量 :在application ->config/ constants.php中增加 /*m ...
- Activiti源码分析(框架、核心类。。。)
http://jiangwenfeng762.iteye.com/blog/1338553 Activiti是业界很流行的java工作流引擎,关于Activiti与JBPM5的关系和如何选择不是本文要 ...
- Spring Security——核心类简介——获得登录用户的相关信息
核心类简介 目录 1.1 Authentication 1.2 SecurityContextHolder 1.3 AuthenticationManager和Authenti ...
- lucene原理及源码解析--核心类
马云说:大家还没搞清PC时代的时候,移动互联网来了,还没搞清移动互联网的时候,大数据时代来了. 然而,我看到的是:在PC时代搞PC的,移动互联网时代搞移动互联网的,大数据时代搞大数据的,都是同一伙儿人 ...
随机推荐
- eclipse下maven项目保持原有目录结构配置resin运行环境
maven项目用起来很方便,但是它的目录结构和eclipse的目录结构是有区别的,故而在eclipse下的maven项目,直接运行调试是有一些问题的. 为了方便maven项目的运行调试,因而也就有了像 ...
- echo命令详解
echo: echo [-neE] [arg ...] echo会将输入的字符串送往标准输出.输出的字符串间以空白字符隔开, 并在最后加上换行号. Options: -n 不在最后自动换行 -e 使用 ...
- o(1)复杂度之双边滤波算法的原理、流程、实现及效果。
一.引言 双边滤波在图像处理领域中有着广泛的应用,比如去噪.去马赛克.光流估计等等,最近,比较流行的Non-Local算法也可以看成是双边滤波的一种扩展.自从Tomasi et al等人提出该 ...
- 【2016-11-5】【坚持学习】【Day20】【Linq where in 语句】
今天用到一个where in LINQ 语句 IEnumerable<Line> lines = wf.Lines.Where(n => n.RightNode == formR ...
- 利用Caffe做回归(regression)
Caffe应该是目前深度学习领域应用最广泛的几大框架之一了,尤其是视觉领域.绝大多数用Caffe的人,应该用的都是基于分类的网络,但有的时候也许会有基于回归的视觉应用的需要,查了一下Caffe官网,还 ...
- JS中的“!!”
var o={flag:true}; var test=!!o.flag;//等效于var test=o.flag||false; alert(test); 由于对null与undefined用! ...
- web端功能测试总结(一)
一.功能测试 1.1链接测试 链接是web应用系统的一个很重要的特征,主要是用于页面之间切换跳转,指导用户去一些不知道地址的页面的主要手段,链接测试一般关注三点: 1)链接是否按照既定指示那样,确实链 ...
- 给大家推荐一款高大上的代码高亮插件(sublime,github风格)——highlight.js
经常在一些大神博客里面看到非常好看的高亮代码,有sublime风格,GitHub风格等等.毫无疑问,好的高亮代码插件可以不仅仅让你的博文显得更高大上,更重要的是舒适的阅读体验.经过我在网上的一番搜罗, ...
- 2016-2017-1 《信息安全系统设计基础》 学生博客及Git@OSC 链接
2016-2017-1 <信息安全系统设计基础> 学生博客及Git@OSC 链接 博客 1452 20145201李子璇 20145202马 超 20145203盖泽双 20145204张 ...
- knockoutJS学习笔记08:表单域绑定
前面的绑定都是用在基本标签上,这章主要讲表单域标签的绑定. 一.value 绑定 绑定标签:input text.textarea. <p>用户名:<input type=" ...