使用python或ruby中的scrooge和客户端在scala中编写一个thrift服务器

时间:2012-07-18 20:12:17

标签: scala thrift finagle scrooge

我想在Scala中编写一个thrift服务实现(使用Scrooge)但不使用Finagle,因为我无法为Finagle服务器编写ruby / python客户端。问题是,使用scrooge服务似乎没有实现“处理器”类。

假设我有这样的节俭定义:

service TestService {
   void testFunction(1: string message);
}

我使用scrooge生成scala文件,当我尝试使用thrift的标准实现来scala运行服务器时:

val st = new TServerSocket(9999)
val processor = new TestService.Processor(new TestServiceImpl)
val arg = new TThreadPoolServer.Args(st)
arg.processor(processor) 
val server = new TThreadPoolServer(arg)
server.serve()

生成的TestService对象似乎没有Processor内部类。不知道如何在没有Finagle的情况下做到这一点?或者作为另一种解决方案,如何将python或ruby客户端写入finagle thrift服务器?

3 个答案:

答案 0 :(得分:6)

您必须在Scrooge中使用finagle thrift实现。请注意,它与所有wire和IDL兼容,因此您可以使用您想要的任何实现,只要您共享IDL。

您可以为finagle thrift服务编写Ruby或Python客户端:它使用相同的协议。

答案 1 :(得分:5)

根据您linked的项目,您的客户端和服务器之间似乎存在传输不匹配。

您的python客户端正在使用缓冲传输:

transport = TTransport.TBufferedTransport(transport)

但您的scala服务器正在使用框架式传输:

.codec(ThriftServerFramedCodec())

如果您更改python客户端以使用框架传输,您的问题应该消失:

transport = TTransport.TFramedTransport(transport)

答案 2 :(得分:2)

我的问题已经通过在python和scala中使用相同的传输来解决。

在我的python客户端中。

transport = TTransport.TFramedTransport(transport)

您可以找到工作link

的示例