2011-03-02 11 views
1

私はRMIのJavaチュートリアルを通して読んでいます。私は、リモートインタフェースを実装するためにここで概説されたアプローチが好き:RMI - リモートオブジェクト - 設計の質問

http://download.oracle.com/javase/tutorial/rmi/implementing.html

私が知りたいのですがどうしている2つのこと:

1)上記のリンクで概説しexecuteTask方法につきましてComputeEngineがTaskのexecuteメソッドを呼び出すだけの場合、この設計によってリモートオブジェクト(タスク)が何らかのグローバル状態にアクセスすることをどのように許可するのですか?

2)このデザインはマルチスレッド環境に適していますか?

本当にありがとうございます。

答えて

1

広告。 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を受け取ってサーバー上で実行することは非常に印象的ですが、あまり安全ではないことを覚えておいてください。

+0

こんにちはトマシュ、素晴らしい返信。ありがとうございました。最初の答えに関して、ComputeEngineのプライベートインスタンス変数であれば、タスクはどのように 'globalContext'にアクセスできますか?これが静的であれば、それは良くないでしょうか?再度、感謝します。 – Joeblackdev

+1

私は明確な例を追加しました。 –

+0

Tomasz、あなたの助けを大変ありがとう。よろしく – Joeblackdev