vertx核心类之VertxImpl

在Vert.x中,Vertx接口是最为重要的一个接口,vertx-core的基础功能都在此接口中提供。这篇文章中我们就来分析一下Vertx接口体系的内部实现以及创建流程。本文对应Vert.x的版本为 3.2.1

Vertx接口体系

我们来看一下Vertx接口的UML关系:

可以看到有VertxImpl <:< VertxInternal <:< Vertx这个继承链。这里我们先不研究MeasuredMetricsProvider这两个接口。我们先来看一下VertxInternal的结构:

可以看到里边包含了各种操作多线程、执行回调等等的方法。VertxInternal接口仅供vertx-core内部调用。

VertxImpl类是对VertxInternalVertx接口的实现。我们创建的Vertx实例都是VertxImpl

Vertx创建流程以及内部实现

通常,我们都会通过Vertx接口中的静态方法vertx创建Vertx实例:

1
Vertx vertx = Vertx.vertx();

vertx方法底层通过工厂模式创建VertxImpl实例:

123
static Vertx vertx() {  return factory.vertx();}
12345678
public class VertxFactoryImpl implements VertxFactory {

 @Override  public Vertx vertx() {    return new VertxImpl();  }  // ...}

下面我们来探究一下VertxImpl类的创建流程和内部实现。我们首先来看一下VertxImpl类的实例成员:

12345678910111213141516171819202122
private final FileSystem fileSystem = getFileSystem();private final SharedData sharedData;private final VertxMetrics metrics;private final ConcurrentMap<Long, InternalTimerHandler> timeouts = new ConcurrentHashMap<>();private final AtomicLong timeoutCounter = new AtomicLong(0);private final ClusterManager clusterManager;private final DeploymentManager deploymentManager;private final FileResolver fileResolver;private final Map<ServerID, HttpServerImpl> sharedHttpServers = new HashMap<>();private final Map<ServerID, NetServerImpl> sharedNetServers = new HashMap<>();private final ExecutorService workerPool;private final ExecutorService internalBlockingPool;private final OrderedExecutorFactory workerOrderedFact;private final OrderedExecutorFactory internalOrderedFact;private final ThreadFactory eventLoopThreadFactory;private final NioEventLoopGroup eventLoopGroup;private final NioEventLoopGroup acceptorEventLoopGroup;private final BlockedThreadChecker checker;private final boolean haEnabled;private EventBus eventBus;private HAManager haManager;private boolean closed;

这里面包含了一系列重要的类。我们将在初始化部分来分析这些成员的作用。下面我们来看一下构造函数:

1234567891011
VertxImpl() {  this(new VertxOptions());}

VertxImpl(VertxOptions options) {  this(options, null);}

VertxImpl(VertxOptions options, Handler<AsyncResult<Vertx>> resultHandler) {  // ...}

可以看到最终都会调用到VertxImpl(VertxOptions options, Handler<AsyncResult<Vertx>> resultHandler)这个构造函数,下面我们就来分析一下。

首先,Vertx会检查当前是否有Vertx实例运行(通过factory.context()方法)。如果有实例运行的话就会给出警告。

1234
// Sanity checkif (Vertx.currentContext() != null) {  log.warn("You‘re already on a Vert.x context, are you sure you want to create a new Vertx instance?");}

接着Vertx会初始化checker成员,它是一个BlockedThreadChecker,作用是检查vertx context中是否有阻塞的线程,如果有线程阻塞则给出警告。

12
checker = new BlockedThreadChecker(options.getBlockedThreadCheckInterval(), options.getMaxEventLoopExecuteTime(),                                   options.getMaxWorkerExecuteTime(), options.getWarningExceptionTime());

接下来,Vertx会初始化EventLoop线程工厂eventLoopThreadFactory,它用于产生EventLoop线程。然后初始化eventLoopGroup并进行配置。NioEventLoopGroup是Netty里的概念,将在稍后进行介绍。

123
eventLoopThreadFactory = new VertxThreadFactory("vert.x-eventloop-thread-", checker, false);eventLoopGroup = new NioEventLoopGroup(options.getEventLoopPoolSize(), eventLoopThreadFactory);eventLoopGroup.setIoRatio(NETTY_IO_RATIO);

接下来,Vertx会初始化Acceptor EventLoop线程工厂,并对其进行配置。然后对workerPoolinternalBlockingPool这两个线程池进行初始化。其中workerPool用于执行worker线程,internalBlockingPool用于执行阻塞操作线程。

123456789
ThreadFactory acceptorEventLoopThreadFactory = new VertxThreadFactory("vert.x-acceptor-thread-", checker, false);// The acceptor event loop thread needs to be from a different pool otherwise can get lags in accepted connections// under a lot of loadacceptorEventLoopGroup = new NioEventLoopGroup(1, acceptorEventLoopThreadFactory);acceptorEventLoopGroup.setIoRatio(100);workerPool = Executors.newFixedThreadPool(options.getWorkerPoolSize(),                                          new VertxThreadFactory("vert.x-worker-thread-", checker, true));internalBlockingPool = Executors.newFixedThreadPool(options.getInternalBlockingPoolSize(),                                                    new VertxThreadFactory("vert.x-internal-blocking-", checker, true));

然后,Vertx会初始化两个线程池工厂workerOrderedFactinternalOrderedFact,它们的类型是OrderedExecutorFactory,里边包含一种能够按照次序执行线程的线程池。

12
workerOrderedFact = new OrderedExecutorFactory(workerPool);internalOrderedFact = new OrderedExecutorFactory(internalBlockingPool);

接下来,Vertx会依次对文件解析器fileResolver、部署管理器deploymentManager、SPI管理器metrics进行初始化,并且根据配置来决定是否初始化集群管理器clusterManager和高可用管理器haManager。然后Vertx会调用createAndStartEventBus(options, resultHandler)方法,创建并启动EventBus。最后对共享数据成员sharedData进行初始化。

12345678910111213141516171819202122232425
this.fileResolver = new FileResolver(this);this.deploymentManager = new DeploymentManager(this);this.metrics = initialiseMetrics(options);this.haEnabled = options.isClustered() && options.isHAEnabled();if (options.isClustered()) {  this.clusterManager = getClusterManager(options);  this.clusterManager.setVertx(this);  this.clusterManager.join(ar -> {    if (ar.failed()) {      log.error("Failed to join cluster", ar.cause());    } else {      // Provide a memory barrier as we are setting from a different thread      synchronized (VertxImpl.this) {        haManager = new HAManager(this, deploymentManager, clusterManager, options.getQuorumSize(),                                  options.getHAGroup(), haEnabled);        createAndStartEventBus(options, resultHandler);      }    }  });} else {  this.clusterManager = null;  createAndStartEventBus(options, resultHandler);}this.sharedData = new SharedDataImpl(this, clusterManager);}

经过一系列的构造后,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

时间: 2024-10-29 19:11:30

vertx核心类之VertxImpl的相关文章

CloudStack核心类ApiServlet、ApiServer、ApiDispatcher、GenericDaoBase源码分析

ApiServlet 首先从整体上看下ApiServlet,Outline视图如下, 一.注意@Inject依赖的是javax.inject.jar,它和spring的@Autowired的区别在于使用它时变量不用生成相应的set方法. 二.CloudStack所有的请求都会被ApiSerlet拦截处理,进入到doGet()或者doPost()方法,然后统一交由processRequest()处理. 三.processRequestInContext()方法: 1.更多的是日志记录和异常信息处理

Android中直播视频技术探究之---基础核心类ByteBuffer解析

一.前言 前一篇文章我们介绍了Android中直播视频技术的基础大纲知识,这里就开始一一讲解各个知识点,首先主要来看一下视频直播中的一个重要的基础核心类:ByteBuffer,这个类看上去都知道了,是字节缓冲区处理字节的,这个类的功能非常强大,也在各个场景都有用到,比如网络数据底层处理,特别是结合网络通道信息处理的时候,还有就是后面要说到的OpenGL技术也要用到,当然在视频处理中也是很重要的,因为要处理视频流信息,比如在使用MediaCodec进行底层的视频流编码的时候,处理的就是字节,我们如

Tomcat 学习进阶历程之Tomcat架构与核心类分析

前面的http及socket两部分内容,主要是为了后面看Tomcat源码而学习的一些网络基础.从这章开始,就开始实际深入到Tomcat的'内在'去看一看. 在分析Tomcat的源码之前,准备先看一下Tomcat的架构与一些核心类的简单分析,并简单介绍一下Tomcat是如何处理一次Http请求的.这部分内容有相当一部分来源于网络,在此,感谢原作者的贡献. Tomcat的总体架构 Tomcat的架构关系可以从Tomcat的配置文件server.xml中看到端倪. 从上图中可以看出Tomcat 的心脏

Hibernate中的五大核心类和接口

Hibernate中的五大核心类和接口 Configuration(类) : 加载配置文件hibernate.cfg.xml文件中的配置信息,从而得到: 1).hibernate的底层信息: 数据库连接,jdbc驱动,方言(dialect),用户名 ,密码 2).hibernate的映射文件(*.hbm.xml) SessionFactory(接口): 通过configuration创建的sessionFactory, 可以用来获得session openSession(); sessionFa

cocos2dx[3.2](8) ——核心类Director/Scene/Layer/Sprite

[核心类] 导演Director.场景Scene.布景层Layer.精灵Sprite的概念请移步: cocos2dx基础篇(3)--第一个程序HelloWorld 导演控制场景,场景控制图层,图层控制精灵,精灵控制动作. 相互之间的关系框架如下图所示:     由此看出:         (1)整个游戏一般只有一个导演.         (2)一个游戏可以由多个场景组成(菜单界面.游戏界面.游戏结束界面等),但是每次导演只能指导一个场景的运作.         (3)一个场景可以由多个图层组成(

从字节码和JVM的角度解析Java核心类String的不可变特性

1. 前言 最近看到几个有趣的关于Java核心类String的问题. String类是如何实现其不可变的特性的,设计成不可变的好处在哪里. 为什么不推荐使用+号的方式去形成新的字符串,推荐使用StringBuilder或者StringBuffer呢. 翻阅了网上的一些博客和stackoverflow,结合自己的理解做一个汇总. 2. String类是如何实现不可变的 String类的一大特点,就是使用Final类修饰符. A class can be declared final if its

Hibernate核心类用法-使用Transaction管理事务

一个典型的事务应该使用下面的形式 在创建完Session对象后即使用beginTransaction()启动事务 从此开始直到commit()之间的代码 都会处于同一个事务中 这两个函数之间所有的数据库代码都会在commit()时一次性提交 在提交时 如果某一句代码执行出现异常 就会回滚这一次事物之间的所有执行代码 public User getUser(String username) throws HibernateException { Session session = null; Tr

SpringMVC核心类与接口

DispatcherServlet   -- 前置控制器 HandlerMapping接口 -- 处理请求的映射 HandlerMapping接口的实现类: SimpleUrlHandlerMapping  通过配置文件,把一个URL映射到Controller DefaultAnnotationHandlerMapping  通过注解,把一个URL映射到Controller类上 HandlerAdapter接口 -- 处理请求的映射 AnnotationMethodHandlerAdapter类

PHP MVC框架核心类

现在我们举几个核心框架的例子演示:在framework/core下建立一个Framework.class.php的文件.写入以下代码: // framework/core/Framework.class.php class Framework { public static function run() { echo "run()"; } 兄弟连教育在这个演示中创建了一个静态方法run(),现在让我们通过入口文件index.php测试一下: <?php require "