【问题标题】:Error creating a field with functions when using Apache Thrift使用 Apache Thrift 时创建带有函数的字段时出错
【发布时间】:2015-09-25 01:47:19
【问题描述】:

我开始使用 apache thrift(java 编程),很难找到深入解释它的文档 - 所以我希望你能帮助我。

我正在尝试创建一个服务(接口),该服务(接口)具有返回具有函数的字段的函数(例如:另一个接口)。

我试过这段代码:

namespace java test

service A {
  string somefunc()
}

service B {
  string somefunc2(),
  A getA()
}

但是我没有成功..当我尝试编译 thrift 文件时,我收到一个错误,它在服务 B 中 - A 字段未定义。

我也试过了:

namespace java test

struct A {
  1: string somefunc()
}

service B {
  A getA()
}

这次它编译成功了,但是它并没有把 somefunc 当作一个函数而是当作一个字符串类型的字段。

有没有我想要的东西?

谢谢!

【问题讨论】:

    标签: java thrift


    【解决方案1】:

    Thrift 通过网络发送序列化的数据结构。没有标准的方式来发送可执行代码。各种语言允许通过网络传输代码(即 java .class 文件或文本形式的 python 脚本),但不能互操作,因此不受 Thrift 支持。

    不过,如果您需要,thrift 也可以用于服务发现。单一的 thrift 服务总是绑定在特定的主机/端口上。因此,服务发现代码的节俭定义可能如下所示:

    namespace java test
    
    struct Endpoint {
      1: required string host;
      2: required i32 port;
    }
    
    service A {
      string somefunc()
    }
    
    service B {
      string somefunc2(),
      Endpoint getA()
    }
    

    服务发现代码可能如下所示:

    B.Client bClient = <.....>
    
    Endpoint endpoint = bClient.getA();
    TTransport transport = new TSocket(endpoint.host, endpoint.port);
    transport.open();
    A.Client aClient = = new A.Client(new TBinaryProtocol(transport));
    aClient.somefunc2();
    

    如果需要,Endpoint 定义可能会扩展协议/传输元数据,允许在二进制/紧凑/JSON 协议和 TTransport/TFramedTransport/等之间进行选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-03
      • 2021-12-13
      • 2014-05-19
      • 1970-01-01
      • 2021-07-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多