首页 > 代码库 > libthrift0.9.0解析(五)之TNonblockingServer&THsHaServer
libthrift0.9.0解析(五)之TNonblockingServer&THsHaServer
本文是一边看代码一边写的,是真随笔,随看随下笔。
看TNonblockingServer,先看其父类AbstractNonblockingServer。一般来说,父类封装的都是通用的东西,具体的底层实现方式交由子类来实现。因此抽象类一般会作为两层之间的交点所在,父类在上层,子类在下层。先看父类,再看子类,先看高层,再看低层,先看框架再忽略底层细节,遇到一些细节非常想看想深入进去时,也会忍住不看,待到上层了解完毕之后,再回过头来看。必要先在头脑中形成一个坐标系,然后再往其中安放具体物件。不知这样对也不对。
AbstractNonblockingServer父类为Tserver,实现了serve方法:
public void serve() { // start any IO threads if (!startThreads()) { return; } // start listening, or exit if (!startListening()) { return; } setServing(true); // this will block while we serve waitForShutdown(); setServing(false); // do a little cleanup stopListening(); }
startThreads方法开启一个线程,处理所有通道(连接)的所有请求,交由子类实现;startListening方法为通用方法,执行监听:serverTransport_.listen()。
看其子类TNonblockingServer中startThreads的实现:利用serverTransport_(必为TNonblockingServerTransport类型)构造一个SelectAcceptThread线程,然后开启。到此为止,服务开启完毕。
下面看SelectAcceptThread的实现,抽象父类为AbstractSelectThread,直接继承自Thread类。
按照上述原则,看AbstractSelectThread的构造函数和run方法。构造函数初始化了一个selector,没有run方法,其它很多方法,略去不看先。接着看子类SelectAcceptThread。
构造函数中把serverTransport注册到selector中,注册事件为accept。run方法主要代码:
while (!stopped_) { select(); processInterestChanges();}
看其字面,select处理具体事件,processInterestChanges处理其它一些事务。
在select函数中,用handleAccept、handleRead、handleWrite处理各种事件,具体怎么处理,不用管先。
在processInterestChanges函数中,遍历Set<FrameBuffer>列表selectInterestChanges,对每个FrameBuffer调用其changeSelectInterests方法。ok,这轮完毕。
libthrift0.9.0解析(五)之TNonblockingServer&THsHaServer