在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函数处理读写请求。
最后欢迎大家访问我的个人网站:1024s