我想用Scala (使用Scrooge)编写一个thrift服务实现,但不使用Finagle,因为我不能为Finagle服务器编写ruby/python客户端。问题是scrooge的服务似乎没有实现"Processor“类。
假设我有这样一个节俭的定义:
service TestService {
void testFunction(1: string message);
}我使用scrooge生成了scala文件,当我尝试使用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对象似乎没有处理器内部类。知道如何在没有Finagle的情况下做到这一点吗?或者作为另一种解决方案,如何编写python或ruby客户端来管理thrift服务器?
发布于 2012-07-19 21:38:52
根据您linked到的项目,看起来客户端和服务器之间的传输不匹配。
您的python客户端正在使用缓冲传输:
transport = TTransport.TBufferedTransport(transport)但是您的scala服务器使用的是帧传输:
.codec(ThriftServerFramedCodec())如果您将python客户端更改为使用分帧传输,那么您的问题应该会消失:
transport = TTransport.TFramedTransport(transport)发布于 2012-07-19 05:29:19
你必须在Scrooge中使用finagle thrift实现。请注意,它完全兼容wire和IDL,所以只要您共享IDL,就可以使用任何您想要的实现。
您可以为finagle same服务编写Ruby或Python客户端:它使用相同的协议。
发布于 2012-07-19 21:38:53
我的问题已经通过在python和scala中使用相同的传输解决了。
在我的python客户端中。
transport = TTransport.TFramedTransport(transport)您可以找到样例working link
https://stackoverflow.com/questions/11549490
复制相似问题