之前对Thrift自动生成代码的实现细节做了详细的分析,下面进行处理层的实现做详细分 析了!会利用到自动代码生成的知识。
这部分是协议层和用户提供的服务实现之间的 纽带,定义了调用服务实现的接口框架,真正实现某种服务接口是通过上一章介绍的代码生 成工具生成的代码。本章将介绍这个框架的基本原理,然后通过生成的一个实例来具体介绍 怎样完成一次完整的服务,这个可能涉及到下面章节的一些知识,对于这些知识不详细分析 其功能,只是介绍它在其中起什么作用。选择的实例是Facebook内部用这个框架实现的一个 分布式日志收集系统scribe。下面是这部分相关类的类关系图:
从上图中可以看出TProcessor是这个部分的顶层基类,其他之类基本上都是通过Thrift代 码生成工具生成的,只有少数是为了扩展一些功能而直接写代码实现,如PeekProcessor类就 增加了一些对原始数据处理的功能。scribeProcessor和FacebookServiceProcessor类就是用 代码生成器根据IDL文件生成的,也是我们后面需要分析的一个实例。
第一节 服务 接口调用框架分析
这个基本的框架包括三个类,一个就是抽象类TProcessor,负责 调用用户定义的服务接口,从一个接口读入数据,写入一个输出接口。一个最主要的函数定 义如下:
virtual bool process(boost::shared_ptr<protocol::TProtocol> in,
boost::shared_ptr<protocol::TProtocol> out, void* connectionContext) = 0;
这个函数是一个纯虚函数,所以继承这个类的子类都必须实现这个函数,这个函 数就是最主要的数据传输功能。
第二个类就是负责处理TProcessor类产生的事件的类 TProcessorEventHandler,主要定义了一些当某事件发生时的处理函数,例如当读取参数之 前可以做一些处理功能。下面是这个类定义的各个成员函数,每一个函数都处理一种事件发 送时的情况:
最后一个类就是 TProcessorContextFreer类,这个类是一个帮助类,帮助生成的代码来释放上下文资源。