広告。 1:リモートクライアントはComputeEngine
クラスについては何も知らず、Compute
インターフェイスのみを認識します。また、サーバーの実装は完全に変更される可能性がありますが、インターフェースが変更されない場合、クライアントは気付かないでください。あなたは、リモートクライアントからのタスクにいくつかコンテキストを渡したい界面層の上にそれを行う場合:
public class ComputeEngine implements Compute {
private GlobalContext globalContext = //...
public <T> T executeTask(Task<T> t) {
return t.execute(globalContext);
}
この方法は、各タスクはglobalContext
へのアクセス権を持っているとglobalContext
から期待する正確に何を知っている(ありますかサーバー機能、コンテキスト)。 GlobalContext
は、JavaBean、またはより可能性の高いサービスインターフェイスです。クライアント側では
それがこの
Compute compute = //obtain RMI client stub somehow
compute.executeTask(new Task<String>() {
public String execute(GlobalContext globalContext) {
//Note that this code is executed on the server and
//getFoo() is implemented on the server side. We only know its interface
globalContext.getFoo();
//...
}
}
広告のように見えるかもしれません。 2:複数のクライアントが同時にサービスを呼び出すことがあります。ただし、スレッドセーフな方法でサーバーを実装するのはあなた次第です。チュートリアルの例はスレッドセーフであると言いましたが、GlobalContext
を使用している私のコードはそうではないかもしれません。複数のクライアントが同一のインスタンスglobalContext
を同時に使用しますが、いくつかの問題が発生する可能性があります。それはおそらく最も興味深い部分です。
最後に、リモートクライアントから未知のTask
を受け取ってサーバー上で実行することは非常に印象的ですが、あまり安全ではないことを覚えておいてください。
こんにちはトマシュ、素晴らしい返信。ありがとうございました。最初の答えに関して、ComputeEngineのプライベートインスタンス変数であれば、タスクはどのように 'globalContext'にアクセスできますか?これが静的であれば、それは良くないでしょうか?再度、感謝します。 – Joeblackdev
私は明確な例を追加しました。 –
Tomasz、あなたの助けを大変ありがとう。よろしく – Joeblackdev