码迷,mamicode.com
首页 > 其他好文 > 详细

libthrift0.9.0解析(五)之TNonblockingServer&THsHaServer

时间:2014-11-03 16:03:20      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:blog   io   ar   java   for   sp   div   on   art   

本文是一边看代码一边写的,是真随笔,随看随下笔。

看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

标签:blog   io   ar   java   for   sp   div   on   art   

原文地址:http://www.cnblogs.com/wuseguang/p/4071374.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!