使用Apache Thrift时创建包含函数的字段时出错

时间:2013-01-09 23:27:53

标签: java thrift

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

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

我试过这段代码:

namespace java test

service A {
  string somefunc()
}

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

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

我也试过了:

namespace java test

struct A {
  1: string somefunc()
}

service B {
  A getA()
}

这一次它成功编译但是它没有将somefunc计为函数,而是将其作为字符串类型中的字段。

无论如何要做出我想要的东西吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

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

但是,如果需要,可以将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 /等之间进行选择。