Search code examples
scalathriftfinaglescrooge

Write a thrift server in scala using scrooge and client in python or ruby


I want to write a thrift service implementation in Scala (using Scrooge) but without the use of Finagle, since I couldn't write a ruby/python client for Finagle servers. The problem is that with scrooge the service doesn't seem to implement "Processor" class.

Assume I have a thrift definition like this:

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

and I generated the scala files using scrooge, when I tried to use the standard implementation of thrift for scala with that to run the server:

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()

The generated TestService object doesn't seem to have the Processor inner class. Any idea how to do that without Finagle? or as another solution, how to write a python or ruby client to finagle thrift servers?


Solution

  • Based on the project you linked to, it appears that you have a transport mismatch between client and server.

    Your python client is using the buffered transport:

    transport = TTransport.TBufferedTransport(transport)
    

    But your scala server is using the framed transport:

    .codec(ThriftServerFramedCodec())
    

    If you change the python client to use the framed transport, your issue should go away:

    transport = TTransport.TFramedTransport(transport)