4

Scalaで(Scroogeを使用して)thriftサービスの実装を作成したいのですが、Finagleサーバー用のruby / pythonクライアントを作成できなかったため、Finagleを使用しませんでした。問題は、scroogeでは、サービスが「Processor」クラスを実装していないように見えることです。

私がこのような倹約の定義を持っていると仮定します:

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

そして、scroogeを使用してscalaファイルを生成しました。これは、サーバーを実行するためにscalaのthriftの標準実装を使用しようとしたときです。

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サーバーに書き込む方法は?

4

3 に答える 3

6

Scroogeではfinaglethriftの実装を使用する必要があります。これはすべてワイヤーおよびIDLと互換性があるため、IDLを共有していれば、必要な実装を使用できることに注意してください。

finaglethriftサービス用にRubyまたはPythonクライアントを作成できます。同じプロトコルを話します。

于 2012-07-18T21:29:19.120 に答える
5

リンクしたプロジェクトに基づいて、クライアントとサーバーの間にトランスポートの不一致があるようです。

Pythonクライアントはバッファリングされたトランスポートを使用しています:

transport = TTransport.TBufferedTransport(transport)

しかし、あなたのscalaサーバーはフレーム化されたトランスポートを使用しています:

.codec(ThriftServerFramedCodec())

フレーム付きトランスポートを使用するようにPythonクライアントを変更すると、問題は解決するはずです。

transport = TTransport.TFramedTransport(transport)
于 2012-07-19T13:38:51.520 に答える
2

私の問題は、Pythonとscalaの両方で同じトランスポートを使用することで解決されました。

私のPythonクライアントで。

transport = TTransport.TFramedTransport(transport)

サンプルの作業リンクを見つけることができます

于 2012-07-19T13:38:53.003 に答える