我想在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服务器?
答案 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
的示例