thrift 笔记

TBaseProcessor

TBaseProcessor 是一个比较简单的 TProcessor 实现。不过 TBaseProcessor 是一个抽象类,部分方法的具体实现要在 Thrift 生成的 service 接口代码中实现。

下面是 TBaseProcessor 的部分代码片段:

public abstract class TBaseProcessor<I> implements TProcessor {

  ...

  private final I iface;
  private final Map<String,ProcessFunction<I, ? extends TBase>> processMap;

  @Override
  public boolean process(TProtocol in, TProtocol out) throws TException {
    TMessage msg = in.readMessageBegin();
    ProcessFunction fn = processMap.get(msg.name);
    if (fn == null) {
      TProtocolUtil.skip(in, TType.STRUCT);
      in.readMessageEnd();
      TApplicationException x = new TApplicationException(TApplicationException.UNKNOWN_METHOD, "Invalid method name: '"+msg.name+"'");
      out.writeMessageBegin(new TMessage(msg.name, TMessageType.EXCEPTION, msg.seqid));
      x.write(out);
      out.writeMessageEnd();
      out.getTransport().flush();
      return true;
    }
    fn.process(msg.seqid, in, out, iface);
    return true;
  }

  ...  

}

在 Thrift 生成的 service 代码中,Processor 初始化的时候,会按照该接口的方法名为 key,方法名对应的处理类(ProcessFunction)为值的形式往 processMap 中放入一些记录。

在调用 TBaseProcessor 的 process 方法时,先从输入的 TProtocol 中读出请求信息 TMesage(包括请求的 ID、name 和类型),再根据 TMessage 中的 name 找出对应的 ProcessFunction。

最后使用 ProcessFunction 来处理业务逻辑。

links