首页 > 代码库 > Thrift0.9.3 C++版代码阅读随笔——TNonblockingServer

Thrift0.9.3 C++版代码阅读随笔——TNonblockingServer

 

0.一些参考资料

 

(参考资料1)对thrift的一个基本介绍可以参考:

http://wenku.baidu.com/link?url=LLL5H3qL4hJ3o6dfq0SBgztqtxYFR5vDyftwowKNRMWiIQ3t87mCu-GMZljxcZVryxxhqna1hM4eu3F7AyCMlC7fFy7yWl18IIl6nY7JKca

 

(参考资料2)thrift IDL定义可参考(就是定义结构化数据和服务的方法):

 

  http://diwakergupta.github.io/thrift-missing-guide/#_defining_services

 

1.基本使用方法

TNonblockingServer是thrift提供的一种多线程非阻塞IO服务。

之所以从这里开始读代码,是因为TServer(TNonblockingServer是TServer的一个子类实现)是框架中比较最贴近用户实现部分的,各部分的划分请参阅(参考资料1)哈。

先看基本的使用:

 1   // FooServing是我们自己定义的thrift服务
 2   // FooServingProcessor是由thrift自动生成的类
 3   // FooServingHandler是我们的业务实现类,90%的代码写在这个类中
 4   shared_ptr<FooServingHandler>
 5     handler(new FooServingHandler());
 6   shared_ptr<TProcessor>
 7     processor(new FooServingProcessor(handler));
 8 
 9   shared_ptr<TProtocolFactory> 
10     protocolFactory(new TBinaryProtocolFactory());
11 
12   shared_ptr<PosixThreadFactory> threadFactory(new PosixThreadFactory());
13   shared_ptr<ThreadManager> threadManager =
14     ThreadManager::newSimpleThreadManager(thread_count);
15   threadManager->threadFactory(threadFactory);
16   threadManager->start();
17 
18   TNonblockingServer server(processor,
19                             protocolFactory,
20                             port,
21                             threadManager);
22   server.setTaskExpireTime(expire_time);
23   server.serve();

当然TNonblockingServer的构造函数有多种实现,并不局限于以上的方式。handler实际上是我们实现的业务逻辑,processer是根据我们定义的服务(IDL文件)自动生成的处理类,它会调用我们的handler,而在server中会接收Client请求,将其转交processer处理。

 

2.serve函数

下面从TNonblockingServer的serve函数入手,继续看。

 1 void TNonblockingServer::serve() {
 2 
 3   if (ioThreads_.empty())
 4     registerEvents(NULL);    // 初始化监听端口、创建ioThreads_、初始化ioThreadFactory_、初始化eventHandler_等
 5 
 6   // Run the primary (listener) IO thread loop in our main thread; this will
 7   // only return when the server is shutting down.
 8   ioThreads_[0]->run();         // 这个是控制线程
 9 
10   // Ensure all threads are finished before exiting serve()
11   for (uint32_t i = 0; i < ioThreads_.size(); ++i) {
12     ioThreads_[i]->join();
13     GlobalOutput.printf("TNonblocking: join done for IO thread #%d", i);
14   }
15 }

 

ioThreads_中的第一个线程是控制线程

未完待续。。。先回家过年啦

Thrift0.9.3 C++版代码阅读随笔——TNonblockingServer