2011-08-01 14 views
6

いくつかのサービスを作成したいと思います。それらを異なる識別子で使いたいと思います。 だから私は:複数のサービスを1つのトランスポートで使用したい(Thrift)

私はユーザーとプロジェクトのサービスを持っている。 私はこれらを同時に使用したいと思います。

私はxmlrpcの "handlermap"にさらに "サービス"を追加できます。

http://ws.apache.org/xmlrpc/server.html

phm.addHandler("Users", 
      Users.class); 
phm.addHandler("Projects", 
       Projects.class); 

私は倹約で同じことをしたいと思います。 test.thrift

typedef i64 UserId 

struct Bonk 
{ 
    1: string message, 
    2: i32 type 
} 

struct Insanity 
{ 
    1: map<Bonk, UserId> userMap, 
    2: list<Bonk> xtructs 
} 



service ThriftTest 
{ 
    void   testVoid(), 
    string  testString(1: string test), 
    byte   testByte(1: byte test), 
    i32   testI32(1: i32 test), 
    i64   testI64(1: i64 test), 
    double  testDouble(1: double test), 
    list<map<i32,i32>> testMap(1: map<i32,i32> test), 
    map<string,string> testStringMap(1: map<string,string> test), 
    set<i32>  testSet(1: set<i32> test), 
    map<i32,map<i32,i32>> testMapMap(1: i32 test), 
    map<UserId, map<i32,Insanity>> testInsanity(1: Insanity argument) 
} 

その後、私はその後、TSERVERのインスタンスに追加し、implementatinoを作成します。ここでは

は簡単な例です。

Users.Processor users_proccesor = new Users.Processor(New UsersImpl()); 
Projects.Processor project_processor = new Projects.Processors(new ProjectsImp()); 
// I would like to add Users and Projects 
ThriftTest.Processor prc = new ThriftTest.Processor(new ThiftTestImp()); 
      TServerTransport serverTransport = new TServerSocket(9090); 
      TServer server = new TSimpleServer(new Args(serverTransport).processor(prc)); 

ここに大きな問題があります。サーバーの複数のインスタンスを追加することはできません。

ありがとうございます。

答えて

4

RPC呼び出しは、 'targetService'フィールドを持たないTMessage構造体のワイヤを介して送信されます。このため、このフィールドをTMessageに追加してリリコンパイルすることなく、複数のサービスを単一のポートにバインドする直接的な方法はありません。

TSimpleSever(または他のTServer)と同様のカスタムTServerを実装することで、ハッキングを行うことができます。

Serverは、ループ内のターゲット・サービスを読み、対応するプロセッサを取得する必要があります:

 ... 
     inputProtocol = inputProtocolFactory_.getProtocol(inputTransport); 
     outputProtocol = outputProtocolFactory_.getProtocol(outputTransport); 
     do { 
     String target = inputProtocol.readString(); 
     processor = processorFactoryMap.get(target).getProcessor(client); 
     while (processor.process(inputProtocol, outputProtocol)); 
     ... 

クライアントがターゲットサービスの文字列と、各メッセージの前に付ける必要があります。これは、カスタムプロトコルでTBinaryProtocolをラップすることにより行うことができます。このアプローチの

public void writeMessageBegin(TMessage message) throws TException { 
    wrapped.writeString(target); 
    wrapped.writeMessageBegin(message); 
} 

主な欠点は、他のクライアントとの相互運用性を失っています。したがって、おそらく、異なるポートで2つの異なるTServerを開始するか、単一のリサイクルサービスですべてのメソッドを定義し、呼び出しを適切なハンドラに委任する方が良いでしょう。

7

マルチプレックスサービス(本質的にここでやりたいことです)は現在統合中です。既に受け入れられているか、またはレビュー中の言語の数多くの言語用のパッチが既にあります。

https://issues.apache.org/jira/browse/THRIFT-563は、開始するのに適しています。

PS:評価者と投稿をお待ちしております;-)

関連する問題