目次 | 前の項目 | 次の項目 | Java Remote Method Invocation |
分散オブジェクトシステムは、ライフタイムの長い持続オブジェクトをサポートするように設計されています。たとえば、極めて多数の持続オブジェクト (たとえば数百万個) で構成されている分散オブジェクトシステムがあるとします。 このシステムで、オブジェクトの実装が起動されたあと、ずっと起動された状態のままであるなら、貴重なシステムリソースを無期限に占有し続けることになり、これは合理的ではありません。また、一般に分散オブジェクトへの参照は、そのオブジェクトが起動されている間だけ有効であるため、システムクラッシュ後にオブジェクト間の通信を確立し直すことができるように、クライアント側ではオブジェクトへの持続性のある参照を保持しておく機能が必要になります。オブジェクト起動は、オブジェクトへの持続性のある参照を提供するとともに、オブジェクトの実装の実行を管理するための機構です。RMI では、起動により必要に応じてオブジェクトの実行を開始できるようになっています。メソッド呼び出しにより、「起動可能」なリモートオブジェクトへのアクセスがあったとき、そのリモートオブジェクトが現在実行中でない場合は、適切な JVM 内でそのオブジェクトの実行が開始されます。
「アクティブ」なオブジェクトとは、任意のシステム内の任意の JVM 上でインスタンスが生成され、エクスポートされたリモートオブジェクトを指します。「パッシブ」なオブジェクトとは、JVM 上でまだインスタンスの生成 (またはエクスポート) は行われていないが、アクティブな状態に移行可能なリモートオブジェクトを指します。パッシブなオブジェクトをアクティブなオブジェクトにすることを、「起動」といいます。起動を行うためには、オブジェクトを JVM に関連付ける、つまり、そのオブジェクトのクラスを JVM にロードし、その持続状態を復元するオブジェクトを必要とします。RMI システムでは、「遅延起動」が使用されています。遅延起動では、メソッドを呼び出すなど、クライアントがオブジェクトを最初に使用するまで、オブジェクトの起動が保留されます。
リモートオブジェクトの遅延起動は、「フォルトリモート参照」(フォルトブロックとも呼ばれる) により実現されています。リモートオブジェクトへのフォルトリモート参照は、そのリモートオブジェクトに対してメソッド呼び出しが最初に行われたとき、アクティブなオブジェクトの参照で「障害を発生」させます。それぞれのフォルト参照は、対象となるリモートオブジェクトの持続ハンドル (起動識別子) と一時リモート参照の両方を保持しています。リモートオブジェクトの起動識別子には、当該オブジェクトの起動時に第三者とやりとりするのに十分な情報が含まれています。一時参照は、動作中のオブジェクトへのアクセスに使用できる、アクティブなリモートオブジェクトへの実際の「ライブ」参照です。フォルト参照では、リモートオブジェクトへのライブ参照が
null
の場合、そのオブジェクトはアクティブではないものと見なされます。メソッドの呼び出しが発生すると、当該オブジェクトのフォルト参照は、起動プロトコルを使用して、新たに起動されたオブジェクトのリモート参照 (ユニキャストリモート参照など) である「ライブ」参照を取得します。フォルト参照は、ライブ参照を取得すると、メソッド呼び出しを背後のリモート参照に転送し、リモート参照は、今度はそれをリモートオブジェクトに転送します。より具体的に言えば、リモートオブジェクトのスタブには、次の 2 つを含む「faulting」リモート参照型が含まれます。
注 - RMI システムでは、リモート呼び出しについては「最大で 1 回」というセマンティクスが遵守されます。言い換えれば、「起動可能」または「ユニキャスト」なリモートオブジェクトの呼び出しは、最大で 1 回までしか送られないということです。したがって、リモートオブジェクトの呼び出しが失敗した場合 (RemoteException
がスローされた場合)、クライアントは、そのリモートメソッドが最大で 1 回しか実行されていない (通常は 1 回も実行されていない) ということを判断できます。