私のプロジェクトの簡単な説明: "managementNode"がある分散環境で動作する "GreetingsNode"というJavaクラスを作成しています。他のノードの情報(ホストポート番号とサービス提供)を受信して格納し、登録されたサービスが提供するメソッドのRPCをディスパッチします。ノードがRPCに応答できる場合、スリフトソケットが開かれ、発呼ノードと応答ノードとの間に接続が確立され、応答ノードが結果を返す。分散環境におけるApache Thrift RPCのJavaメソッド実装
私はRPC用のIDLとフレームワークとしてApache thriftを使用しています。
今問題です。 私のGreetingsNodeHandlerクラスは、単一のメソッド "getHello(user)"(GreetingsNodeクラスのコンストラクタのパラメータである、ノードの名前を含む構造体である)を含む簡単なスリフトインタフェースを実装します。 管理ノードに接続されているGreetingsNode XがそのメソッドのRPCを作成すると、別の登録済みGreetingsNodeがメッセージ「hello X」で応答する必要があります。
結果が返されるハンドラの部分を実装する方法を正しく理解していないため、メソッドの実装が正しく機能するかどうかを確認するjunitテストの記述方法を理解できません。
のassertEquals(client.getHello(ユーザー).getMessage()、 "こんにちはジョン・ドウ")
がうまくいくのassertのような、しかし、私は私の場合、私は置くべきか、得ることはありませんクライアント部分...
GreetingService倹約サービスのためのコード:
struct Message {
1: string message
}
struct User {
1: string name
}
service GreetingsService {
Message getHello(1: User user)
}
GreetingsService方法getHelloを(実装する必要がありますGreetingsServiceHandler用
コード)
public class GreetingsServiceHandler implements GreetingsService.Iface {
private static Random random = new Random(10);
private ManagementService.Client managementClient;
private GreetingsService.Client helloClient;
@Override
public Message getHello(User user) throws TException {
Message answer = null;
// class ServiceProvider is generated by thrift, part of ManagementService thrift service
ServiceProvider provider = null;
List<ServiceProvider>providers = managementClient.getProvidersForService(user.name);
if (providers.isEmpty())
throw new NoProviderAvailableException(); //separate file contains Exception
else {
provider = providers.get(random.nextInt(providers.size()));
//connection between nodes is established here
TTransport helloTransport = new TSocket(provider.getHostName(), provider.getPort());
TProtocol helloProtocol = new TBinaryProtocol(helloTransport);
helloClient = new GreetingsService.Client(helloProtocol);
helloTransport.open();
// here lies my problem
answer = helloClient.getHello(user);
//if I use this instead, then helloClient variable is clearly not used, but of course I need it to answer the method call
answer = answer.setMessage("Ciao " + user.getName() + ", welcome among us!");
}
return answer;
}
とGreetingsNodeコード以下の通りです:
public class GreetingsNode implements NodeIface {
private ThriftServer helloServer;
private ManagementService.Client managementClient;
private NodeManifest nodeManifest;
private User user;
private String name;
public GreetingsNode(NodeManifest nodeManifest, String name) {
this.nodeManifest = nodeManifest;
this.helloServer = new ThriftServer(GreetingsServiceHandler.class);
this.name = name;
}
@Override
public void turnOn() throws TException {
helloServer.start();
TSocket helloServerTransport = new TSocket("localhost", Constants.SERVER_PORT);
TBinaryProtocol helloServerProtocol = new TBinaryProtocol(helloServerTransport);
managementClient = new ManagementService.Client(helloServerProtocol);
this.setUser(new User(name));
helloServerTransport.open();
helloServer = new ThriftServer(GreetingsServiceHandler.class);
//portNegotiator is a class described in a separate file, that handles the registration of other nodes to the managementNode. NodeManifest is a file generated by thrift, part of managementService thrift file, describing a struct that contains hostname and port number of nodes.
PortNegotiator negotiator = new PortNegotiator(managementClient);
negotiator.negotiate(nodeManifest, helloServer);
}
@Override
public void turnOff() {
helloServer.stop();
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
[チュートリアルコード](https:// thrift)をご覧ください。apache.org/tutorial/java)? – JensG
もちろん、私はすでに "arithmeticNode"が別のノードによって作られた "executeOperation"メソッドの呼び出しに応答する機能的な算術計算機を実装しました。 文字列を使用すると、この種の動作が変換されません...ダンノーなぜ実際にはコンセプトが同じでなければ非常に似ているはずです – Gaspare79