之前研究的thrift源码都是属于thrift的同步client&server,接下来看看异步client&server是怎样的?
通过搜索发现异步client&server网上介绍得少或基本没有相关信息,于是乎,还是啃源码来得爽快,因为有一句话我挺赞同的:源代码是最好的设计文档。
下面以test.thrift为例来深入研究异步client&server
/* @file : test.thrift */
namespace cpp thrift.example
service Twitter {
string sendString(1:string data);
}
生成客户代码时,需要加cob_style来生成异步client&server,如下命令:
thrift -r -strict --gen cpp:cob_style -o ./ test.thrift
执行该命令后,所生成目录gen-cpp下有一些生成文件,除了多个Twitter_async_server.skeleton.cpp和Twitter.h&Twitter.cpp多了些异步代码外,其他跟不加cob_style一样。
好了,代码都有了,接下来就通过代码来看看异步client&server是如何工作的。
一、分析异步client
先从客户代码开始研究,上面提到Twitter.h&Twitter.cpp多了些异步代码,那么只要分析这些异步代码就可以了,在test.thrift例中,异步代码主要包括TwitterCobClient、TwitterCobSvIf和TwitterAsyncProcessor三个类,这里先关下TwitterCobClient类,它是异步client,类声明如下:
class TwitterCobClient : virtual public TwitterCobClIf {
public:
TwitterCobClient(boost::shared_ptr< ::apache::thrift::async::TAsyncChannel> channel, ::apache::thrift::protocol::TProtocolFactory* protocolFactory) :
channel_(channel),
itrans_(new ::apache::thrift::transport::TMemoryBuffer()),
otrans_(new ::apache::thrift::transport::TMemoryBuffer()),
piprot_(protocolFactory->getProtocol(itrans_)),
poprot_(protocolFactory->getProtocol(otrans_)) {
iprot_ = piprot_.get();
oprot_ = poprot_.get();
}
boost::shared_ptr< ::apache::thrift::async::TAsyncChannel> getChannel() {
return channel_;
}
virtual void completed__(bool /* success */) {}
void sendString(std::tr1::function<void(TwitterCobClient* client)> cob, const std::strin