RMI -Remote Method Invocation-

Last-modified: 2008-01-01 (火) 07:46:26

目次かも。
始めに
RMI/その概略
RMIを使う。 ~概略編~
ファイル配置・構成
参考HP
セキュリティーポリスィー

 
 
 

始めに

まず、先に言っておく。
これはJAVAです。 JAVAの技術です。
入り口あたりは面白いけど奥が深すぎて、私にはとても難しいので、始めのほうをチョロパッパとしか解説できませんので。あしからず。

 

RMI/その概要

 

一言で言えば分散処理機構というとカッコいいかもしれない。

 

サーバーにあるクラスのメソッドを クライアントが好きなだけ呼び出して使える。
この仕組み自体は自分で用意することも可能だが
そこはそれ、RMIを利用すればプログラマが一から十までネットワーク処理を記述することなく、割と簡単にネットワークを利用できるのだ。

RMIを使う。 ~概略編~

先ずいきなりRMIのプログラミングに入る前に概略を流し見ておいたほうがいい。

 

   クライアント                     サーバ
      ↓                        ↑
     スタブ      →(メソッドの実行要求)   スケルトン
              ←(結果・返り値)

 
 
 

これを見て初めに思うことは
「スタブ? スケルトン? なんじゃそりゃ?」
であろう。

 

だが、これこそがRMIでネットワーク処理を肩代わりしてくれるとても役立つ便利君なのだ。

 

それでは、この「スタブ」や「スケルトン」は如何にして作成することが出来るのかと言えば
ズバリ
rmicコマンドを使えば一瞬なのだ。
rmicとはjavacコマンドと同様に、RMIの規則(ルール)に則って記述されたjavaソースをコンパイルするためのコマンドだ。 
当然使い方もjavacと同様。

 

rmicを実行することによって(ネットワーク越しに使用したいクラス名)_stub.class,_skel.class等が作られる。

 

RMIではスタブとスケルトン無くして始まらないのだ。 仮に弁当に例えれば彼らは弁当箱と主食だな、うん。

 
 
 

しかしこの2つだけがRMIの全てかといえば当然そんなことは無い。 まだ肝心のおかずが無いのだ

 

RMIでおかずを増やす重要な第三の要素・それが「RMIレジストリ」だ。
ではRMIレジストリとは何か?
分厚いRMIの専門書にはネーミングサービスであると書かれていた。
ならばネーミングサービスとは?

 

ここで一つRMIレジストリの例を示そうではないか。 決していい説明が思い付かないとかそんな話じゃないですよ。

 

前提として、RMIレジストリは機能である。
サーバーはRMIレジストリ(以下メンドイのでRと呼称)を起動し、Rに
「rmi(これはおまじない?):サーバ名/クライアントに使わせたいクラス名(呼び出すときに使用する名前。これをリモートオブジェクトという)、そのクラスのインスタンス」
例:Naming.rebind("rmi:localhost/myobj", obj);
を、登録する。
するとクライアントはいつでもそのオブジェクトを参照できるようになるのだ。

 

もちろん、オブジェクトはいくつでも登録できる。 これでおかずが増え放題だ!

 
 

いくつものサーバーでいくつものRMIを起動すれば、
それだけで立派な分散処理機構の実現だ!  既におかずは山盛りだ!!

 
 
 

やや長くなった気がするがこれで概略は完了だ。 後は詳細な実装方法を学ぶばかりダナ。








でも疲れたw

 
 

9/1.追記
とりあえず筆者が参考にしたページをメモっとく。

 

javaでHello World RMI編
  それなりに役に立った。
SUNのRMI入門
  本家? お堅くて読み難いかと思ったら以外にそうでもない。 ただアプレットを例に書いてあるので適当に噛み砕くこと。
RMIについて
  コンパイルの前までは参考になった。 簡潔でわかりやすい。
【連載 】Java入門 第3回:RMI
  SUNのRMI入門をベースにした解説文。 先に本家を読んでおくと( ≧w≦)b
Java RMIのチュートリアル
  短いが痒いところに手が届いた。 かゆ うま。

 
 
 

ファイル配置・構成 20060905

具体的なプログラムの書き方はまあ置いておいて、
サーバー・クライアントそれぞれのファイルの配置を記しておく。(最小構成)

 

サーバーサイド
  ├RemoteInterface (インターフェース。クライアントで実行したいメソッドを定義する。)
  ├RemoteObject(↑をimplementsする。このクラスのインスタンスをRMIレジストリに登録する。)
  └サーバープログラム(メインクラス)

 サーバー・スタブ置き場
    ├RemoteInterface
    └RemoteObject_stub
==========================================
クライアントサイド
  ├RemoteInterface(無いとコンパイルが出来ない。実行もネ)
  └クライアントプログラム(メインクラス)

 
 

ついでに起動の順序も書こう。起動は通常のjavaと同じくCUIで。

 

サーバー
1."set classpath=" と、打ちこんでクラスパスを初期化する。
  サーバでメインクラスを起動する際、起動オプションでスタブがある位置を指定できるのだが、
  クラスパスが参照できる位置にスタブがあると、それを優先的に読み込んでしまい
  オプション指定が無効になるから。

 

2."start rmiregistry"
  RMIレジストリを起動する。
  RMIレジストリを予め起動しておくことにより、メインクラスでリモートオブジェクトの登録ができるのだ。

 

3.サーバーのメインクラス(起動クラス)を実行する。
  起動オプションでセキュリティーポリシーとスタブのある位置を指定して起動。
  例:"java -Djava.security.policy=java.policy -Djava.rmi.server.codebase=file:///C:/RMI/stub/ ServerMain"

 

  セキュリティーポリシーについてはまた別の機会に記載します。たぶん。

 

  -Djava.rmi.server.codebaseは、スタブ・スケルトンの位置を指定するオプション。
  codebase プロパティ上の末尾のスラッシュを忘れたり、ソースファイルで指定された位置にクラスファイルが見つからない (ダウンロード可能でない) 場合、またはプロパティ名を間違って入力した場合は、java.lang.ClassNotFoundException がスローされます。

 

以上でサーバーの準備は終了。

 

クライアント
4.クライアントは前準備は特に無い。
  例:"java -Djava.security.policy=java.policy ClientMain"

 

これで簡単だが、最小構成での実行の流れを書き終わる。

 
 

セキュリティーポリシーについて

 セキュリティーポリシーとは?
  ・サーバーのファイルに対するアクセス権の設定。
  ・テキストファイル。
  ・本家《デフォルトの Policy の実装とポリシーファイルの構文》を読むと意外と分かる。