0

私はapachethrift(javaのプログラミング)を使い始めましたが、それについて深く説明しているドキュメントを見つけるのは非常に難しいので、あなたが私を助けてくれることを願っています。

関数を含むフィールドを返す関数(例:別のインターフェース)を持つサービス(インターフェース)を作成しようとしています。

私はこのコードを試しました:

namespace java test

service A {
  string somefunc()
}

service B {
  string somefunc2(),
  A getA()
}

しかし、成功しませんでした。thriftファイルをコンパイルしようとすると、サービスBでエラーが発生します-フィールドが定義されていません。

私も試しました:

namespace java test

struct A {
  1: string somefunc()
}

service B {
  A getA()
}

今回は正常にコンパイルされましたが、somefuncは関数としてはカウントされませんでしたが、文字列タイプのフィールドとしてはカウントされませんでした。

とにかく私が欲しいもののようなものを作ることはありますか?

ありがとう!

4

1 に答える 1

0

Thriftは、シリアル化されたデータ構造をネットワーク経由で送信します。実行可能コードを送信する標準的な方法はありません。さまざまな言語でコードをネットワーク経由で転送できます(つまり、.classテキスト形式のJavaファイルまたはPythonスクリプト)が、相互運用性にすることはできないため、thriftではサポートされていません。

ただし、必要に応じて、サービス検出に節約が使用される場合があります。シングルスリフトサービスは、常に特定のホスト/ポートにバインドされます。したがって、サービス検出コードの節約定義は次のようになります。

namespace java test

struct Endpoint {
  1: required string host;
  2: required i32 port;
}

service A {
  string somefunc()
}

service B {
  string somefunc2(),
  Endpoint getA()
}

サービス検出コードは次のようになります。

B.Client bClient = <.....>

Endpoint endpoint = bClient.getA();
TTransport transport = new TSocket(endpoint.host, endpoint.port);
transport.open();
A.Client aClient = = new A.Client(new TBinaryProtocol(transport));
aClient.somefunc2();

必要に応じて、Endpointプロトコル/トランスポートメタデータを使用して定義を拡張し、バイナリ/コンパクト/JSONプロトコルとTTransport/TFramedTransportなどから選択できるようにすることができます。

于 2013-01-10T10:08:10.980 に答える