ServercnxnFactory启动

来源:互联网 发布:java相关文献 编辑:程序博客网 时间:2024/05/18 12:30

在runFromConfig时,初始化了客户端与服务端的网络通信类ServerCnxnFactory,默认是NIOServerCnxnFactory,另外还有NettyServerCnxnFactory提供Netty通信方式。在启动QuorumPeer时内部会调用之前初始化好ServerCnxnFactory的start函数。

 public void start() {        stopped = false;        if (workerPool == null) {            workerPool = new WorkerService(                "NIOWorker", numWorkerThreads, false);        }        for(SelectorThread thread : selectorThreads) {            if (thread.getState() == Thread.State.NEW) {                thread.start();            }        }        // ensure thread is started once and only once        if (acceptThread.getState() == Thread.State.NEW) {            acceptThread.start();        }        if (expirerThread.getState() == Thread.State.NEW) {            expirerThread.start();        }    }
WorkerService使用ExecutorServices实现的线程池,NIOServerCnxnFactory中包含了三个类:

(1)AbstactSelectThread:SelectorThread类和AcceptThread类的共同父类,维护一个selector选择器对象。

(2)AcceptThread:管理新的Zookeeper client连接请求,实际上就是利用父类的选择器selector监听ServerSocketChannel的“SelectionKey.OP_ACCEPT”事件,一旦来新的请求,负责建立发和客户端的连接SocketChannel,并从SelectorThread线程份分配一个线程,将该SocketChannel连接放入SelectorThread线程维护的acceptQueue队列中。

(3)SelectorThread:监听AcceptThread分配的已经建立的SocketChannel连接上发生的数据读写事件,并执行实际数据读写。实际上就是利用父类的选择器selector监听在acceptedQueue队列中建立好的连接的数据读写事件,一旦读写事件发生,调用handleIO函数处理读写请求。

原创粉丝点击