しいしせねっと
[技術資料室] [Java] [J2EE]

Java RMIとその仲間たち

Jini, Java Spaces

RMIを基礎にした技術は、Enterprise JavaBeansなどJavaの各所で幅広く利用されています。そこで、どのようなところで使われていて、どのように違いがあるのかを簡単にメモしてみます。詳細までは解説しない予定。Javasoft 等々の解説は、わかりにくいぞぉ。

Java RMIとは何か

遠隔地のサーバのJavaメソッドを、通信プロトコルを特別に記述することなくJavaの呼び出し手順を使って使うことのできる機能です。Javaのインターフェース(interface)の機能をリモートまで拡張したものといえます。
また、クラス配信用のサーバを用意することで、サーバからクライアント側に必要なクラスを配信して実行することもできるようです。この場合もAppletと同じようなセキュリティ・モデルがあります。
リモートからの利用には、Javaのインターフェースを利用します。クライアント側はこのインターフェースを利用して呼び出し機能を作成します。
本来のサーバの他にRMIサーバやクラス転送用のHTTPサーバを立てたり、少々面倒な面もあります。

構成

RMIは、クライアント、サーバ、ネームサーバの3つの環境から成ります。ここがよくわからない場合が多いようです。

  1. ネームサーバを起動する (DNSのようなもの)
  2. RMIサーバアプリケーションを実行する (Apache やSMTPdのようなもの)
    1. サーバはネームサーバにRMIの情報を登録する
    2. Webサーバにクライアントが使用するStubクラスを準備する
  3. クライアントを実行する
    1. ネームサーバにRMIサーバを問い合わせる
    2. Webサーバから、Stubクラスをロードする
    3. RMIサーバとやりとりする

こんな感じでしょうか。

クライアント側に必要なのは、RMIのインターフェースのみ、のはずです。Stubクラスは3-2でWebサーバから必要に応じてダウンロードされるはず。ここは、確認したわけではありませんが・・・。

RMI用に作るクラスは、RMI用のインターフェースと実装クラスです。クライアント側には、インターフェースが必要です。

インターフェースを利用して、クライアント用とサーバ用のStubクラスを生成して、クライアントトサーバの間に割り込ませて通信機能を実現します。

クライアント 通信 サーバ
クライアント
インターフェースにアクセスする
   
Stub
インターフェースを継承
Skel
インターフェースにアクセスする
    サーバアプリ
インターフェースを継承

 

Jiniって何? JiniとRMIの違い

Jiniは、ネットワーク上のデバイスの検索、利用を簡単にしようとしてつくられたもののようですが、デバイス以外にも利用できます。
RMIに比べてサーバが1つ多いという違いがあります。RMIは特定サーバとクライアントとの間で通信をするものですが、Jiniの場合はネットワーク上にどのようなサービスがあるのかを掲示するサーバを設け、そこに登録された機能をクライアントが見つけ、RMIやその他の機能を使って登録されている機能の一部をクライアントに読込み、サーバとも通信しながら利用することができます。プログラムの作成段階では、あまりJiniであることを意識して作成する必要はないようです。Jini自体はDNSやLDAPのような存在ではないでしょうか。Java内で類似のものというとJNDIなのでしょうか?

MSのPnPとJiniの違い?
PnPは、ハードウェアを先に検索して、デバイスドライバ等を全て準備しておきますが、Jiniの場合は利用する段階になってはじめてクライアント側にドライバに相当するclassが読み込まれます。しかし、JiniのLookup サーバではPnPと同様にネットワーク内の全てのJiniデバイスを把握しています。機器別のAPIの統一などは、これからの課題なのかもしれません。HAViとの相互接続もされるようですが、そこのところはまだわからないです。

参考

Java Spaces とは?

エージェント的なことができそうな、分散処理ができそうな環境ですね。
(解説準備中)

クラスの移動

全体的に、classのネット移動がいろいろ面倒なことになっているのではないかと思います。ここのところをすっきりさせることはできないでしょうかね。

Get Thunderbird

[しいしせねっと] [掲示板]