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

Ahm*_*hal 4 scala thrift finagle scrooge

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

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

service TestService {
   void testFunction(1: string message);
}
Run Code Online (Sandbox Code Playgroud)

我使用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()
Run Code Online (Sandbox Code Playgroud)

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

小智 6

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

您可以为finagle thrift服务编写Ruby或Python客户端:它说的是相同的协议.


小智 5

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

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

transport = TTransport.TBufferedTransport(transport)
Run Code Online (Sandbox Code Playgroud)

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

.codec(ThriftServerFramedCodec())
Run Code Online (Sandbox Code Playgroud)

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

transport = TTransport.TFramedTransport(transport)
Run Code Online (Sandbox Code Playgroud)