欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

IDL文件生成的Java类浅析-方法部分

程序员文章站 2022-06-26 08:03:01
...

IDL文件生成的Java类浅析-方法参数部分(m_args)
IDL文件生成的Java类浅析-方法返回值部分(命名格式:methodName_result)

thrift接口方法的实现都有同步和异步之分,异步的部分会在另一篇博文中展开来再说。

对于service的定义的方法来说,一般会生成两个接口,即Iface和AsyncIface,一个同步一个异步。接口中的方法自然就是IDL文件中定义的方法。

Iface:

 public interface Iface {

    public java.lang.String echo(java.lang.String str) throws org.apache.thrift.TException;

  }

对应的也有两个Client,即Client和AsyncClient。

processor负责具体接口中方法的调用,有同步和异步之分,异步的部分会在另一篇博文中展开来再说。

 public static class Processor<I extends Iface> extends org.apache.thrift.TBaseProcessor<I> implements org.apache.thrift.TProcessor {
    private static final org.slf4j.Logger _LOGGER = org.slf4j.LoggerFactory.getLogger(Processor.class.getName());
    public Processor(I iface) {
      super(iface, getProcessMap(new java.util.HashMap<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>>()));
    }

    protected Processor(I iface, java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> processMap) {
      super(iface, getProcessMap(processMap));
    }

    /*service中的每一个方法都会被封装成一个ProcessFunction,被processor直接调用*/
    
    //将方法名放入processMap中
    private static <I extends Iface> java.util.Map<java.lang.String,  org.apache.thrift.ProcessFunction<I, ? extends org.apache.thrift.TBase>> getProcessMap(java.util.Map<java.lang.String, org.apache.thrift.ProcessFunction<I, ? extends  org.apache.thrift.TBase>> processMap) {
      processMap.put("echo", new echo());
      return processMap;
    }

    public static class echo<I extends Iface> extends org.apache.thrift.ProcessFunction<I, echo_args> {
      public echo() {
        super("echo");
      }

      public echo_args getEmptyArgsInstance() {
        return new echo_args();
      }
      
      //这是一个Call类型的方法,由客户端调用并希望返回结果
      protected boolean isOneway() {
        return false;
      }

      //一般的方法不会把异常往外抛
      @Override
      protected boolean rethrowUnhandledExceptions() {
        return false;
      }
	
	  //调用实现类的对应的方法并返回结果
	  //iface是实现了idl中接口方法的类对象
      public echo_result getResult(I iface, echo_args args) throws org.apache.thrift.TException {
      
        //echo_result是thrift根据方法返回值生成的Java类,主要负责
        //返回值的序列化与反序列化,该博文最上方有相关分析的链接
        echo_result result = new echo_result();
        result.success = iface.echo(args.str);
        return result;
      }
    }