thrift 笔记

ProcessFunction

ProcessFunction 就是 Processor 中处理具体每个函数请求的类。该类也是一个抽象类,部分方法需要在 Thrift 生成的 service 代码中实现。

下面是 ProcessFunction 的代码片段:

public abstract class ProcessFunction<I, T extends TBase> {

  ...

  public final void process(int seqid, TProtocol iprot, TProtocol oprot, I iface) throws TException {
    T args = getEmptyArgsInstance();
    try {
      args.read(iprot);
    } catch (TProtocolException e) {
      iprot.readMessageEnd();
      TApplicationException x = new TApplicationException(TApplicationException.PROTOCOL_ERROR, e.getMessage());
      oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid));
      x.write(oprot);
      oprot.writeMessageEnd();
      oprot.getTransport().flush();
      return;
    }
    iprot.readMessageEnd();
    TBase result = null;

    try {
      result = getResult(iface, args);
    } catch(TException tex) {
      LOGGER.error("Internal error processing " + getMethodName(), tex);
      TApplicationException x = new TApplicationException(TApplicationException.INTERNAL_ERROR, 
        "Internal error processing " + getMethodName());
      oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.EXCEPTION, seqid));
      x.write(oprot);
      oprot.writeMessageEnd();
      oprot.getTransport().flush();
      return;
    }

    if(!isOneway()) {
      oprot.writeMessageBegin(new TMessage(getMethodName(), TMessageType.REPLY, seqid));
      result.write(oprot);
      oprot.writeMessageEnd();
      oprot.getTransport().flush();
    }
  }

  ...

}

从上一节中可以看得出,在 Processor 中根据方法名来获取 ProcessFunction 之后,会通过 ProcessFunction 的 process 方法来调用接口实现处理业务逻辑。

处理的大概的流程就是:

1.获取一个新的入参对象。Thrift生成的service中,会对每一个方法封装到一个类里面来处理入参。

2.读取入参

3.如果读取入参失败,返回失败。并且结束流程。如果读取入参成功,调用

result = getResult(iface, args);

来获取返回值。

4.把返回值写到输出的 TProtocol 中。

getResult 和 isOneway 方法是在 Thrift 生成的 service 代码中定义的。

getResult 入参中的 iface,就是用户定义的 Thrift service 的实现。args 就是封装了入参的类。

links