14-1 RMIとは?


・ RMI(Remote Method Invocation)は、その名前のとおり他のマシン上にある オブジェクトのメソッドをネットワークを介して呼び出すための仕組みです。 RMIによってネットワークを通じたメソッドの呼び出しが可能なオブジェクトは、 いわゆる「分散オブジェクト」として振る舞うことが可能になります。 Javaのようなオブジェクト指向の言語では、 処理の多くは他のオブジェクトのメソッドの呼び出しとして記述されます。 こうした分散オブジェクトを構成していけば、 きわめて自然な形でネットワークにまたがるアプリケーションを実現できるでしょう。 あるいは別の見方をするならば、 ネットワーク全体をあたかも1個の巨大な VMのように取り扱うことが可能になります。

 このようなすばらしい可能性を持った分散オブジェクトですが、 RMIに限らず分散オブジェクトを取り扱うプログラムは、 ある種の「敷居の高さ」を感じさせます。それはなぜでしょうか?  ネットワークに関するある程度の予備知識が必要だからでしょうか?  そうではありません。 後で解説するように RMIを始めとする多くの分散オブジェクトのシステムは、 むしろネットワークの取り扱いに関する部分はブラックボックスとして 覆い隠し、特別の知識がなくてもプログラムが書ける仕組みになっています。
 実は最大の原因は Javaの文法自体が元々分散オブジェクトのことを考慮して 設計されたものではないからです。 少なくとも現時点では、 Javaのシステムは単独のマシンの上で起動される VMの世界の内部で閉じています。 VMの内部のオブジェクトと全く同じ記述によって、 他の VMのオブジェクトを生成したりメソッドを呼び出したりすることは許されません。
 他の VMのオブジェクトをコントロールするためには、 あらかじめ特定のプロトコルに基づいて通信を行う必要があります。 もしプログラマが自力で書くとするとおそらく TCPのコネクションから 始めなくてはいけないでしょう。 毎回毎回それを行うのはあまりに非効率ですから、 分散オブジェクトのシステムは TCPのコネクションによる通信の上に、 さらに独自のプロトコルを構築して実現されています。 逆に言えば分散オブジェクトを構築するための手段は無数に存在するわけです。 たとえば RMIが特別な存在で、 他の分散オブジェクトの基礎になっているという関係ではありません。 RMIを最初に取り上げた理由は、 最も原始的で「生の」Javaの取り扱いの部分が見えやすいからです。
 以上のような理由から分散オブジェクトを取り扱うプログラムを記述するためには、 従来の Javaの知識に加えて、それぞれの流儀に従ったオブジェクトの設計の ルールをある程度学ばなければなりません。 こうなってくると Javaの階層の上に、 さらに別の言語が定義されているような印象さえ受けるかもしれません。 実際、RMIの場合も javacコマンドによる通常のコンパイルの他に rmic というもう一段階別のコンパイル作業が行われます。 また VM間の通信を補助するためにネットワークシステム上に、 特定のサービスプログラムを起動する必要が出てきます。 こうした点も従来の Javaのプログラミングだけの世界とは異なります。 最初取っつきにくさを感じさせるのも無理ないかもしれません。