Jini (http://www.sun.com/jini/) は Sun Microsystems 社が Java の API として提供しているネットワークサービスのためのアーキテクチャである.
1. Jini の概要
Jini は SLP (Service Location Protocol) から影響をうけているためアーキテクチャもそれに似ている.しかし,ディレクトリ (ルックアップ・テーブル (lookup table) とよばれる) の存在は必須であり,分散型の構成はとることができない. クライアントがサービスを検索する際には,まずマルチキャスト・メッセージを送出してルックアップサービスを探し出し,それを購読する.Jini にはイベント処理機構があるので,クライアントが興味を登録しておけば,既存のサービスが終了する際や新規サービスが開始される際に通知をうけることができる.すなわち,要求駆動だけでなく,イベント駆動の発見機構を実現することができる.また,ルックアップ・テーブルにはサービスへの参照だけでなく,Java のプログラム (たとえばドライバ) を格納することができる.
Jini はトランスポート・プロトコルや OS・プラットフォームからは独立だが,Java という言語に依存し,クライアントもサービス自体も Java で記述されている必要がある.
2. Jini における発見プロトコル
Jini の発見機能に関しては次のプロトコルが定義されている (JiniTM Technology Core Platform Spec – Discovery and Join, http://www.jini.org/nonav/standards/davis/doc/specs/html/discovery-spec.html).
- (1) マルチキャスト要求プロトコル (multicast request protocol)
- 近接したルックアップサービスを発見するために使用する.
- (2) マルチキャスト・アナウンス・プロトコル (multicast announceent protocol)
- ルックアップサービスの宣伝のために使用する.
- (3) ユニチキャスト発見プロトコル (unicast discovery protocol)
- 特定のルックアップサービスとの通信に使用する.
また,これらの上位に位置する次のプロトコルが定義されている.
- (4) Join プロトコル (join protocol)
- サービスが開始されたときに実行するべき標準的なシーケンスを与える.すなわち,ルックアップサービスにそのサービスを登録するための手順を与える.
3. Jini におけるルックアップサービス
ルックアップサービスへのインタフェースは ServiceRegistrar によって定義されている (JiniTM Technology Core Platform Spec – Lookup Service, http://www.jini.org/nonav/standards/davis/doc/specs/html/lookup-spec.html).インタフェース ServiceRegistrar には次のメソッドが定義されている.(ここで,インタフェース Serviceregistrar を実装するクラスのオブジェクトをサービス登録器とよぶことにする.)
- (1) サービス登録メソッド register()
-
サービス登録器へのサービス登録のために次のメソッドが用意されている.
ServiceRegistration register(ServiceItem item, long leaseDuration) throws RemoteException;
- (2) サービス検索メソッド lookup()
-
サービス登録器におけるサービス検索のために次の 2 個のメソッドが用意されている.
Object lookup(ServiceTemplate tmpl) throws RemoteException; ServiceMatches lookup(ServiceTemplate tmpl, int maxMatches) throws RemoteException;
- (3) イベント通知メソッド notify()
-
サービス登録器へのイベント通知のために次のメソッドが用意されている.
EventRegistration notify(ServiceTemplate tmpl, int transitions, RemoteEventListener listener, MarshalledObject handback, long leaseDuration) throws RemoteException;
- (4) エントリークラス検索メソッド getEntryClasses()
-
指定されたサービス・テンプレートにマッチするすべてのエントリークラスを重複なしに求めるために次のメソッドが用意されている.
Class[] getEntryClasses(ServiceTemplate tmpl) throws RemoteException;
- (5) フィールド値検索メソッド getFieldValues()
-
指定されたサービス・テンプレートにマッチするすべてのフィールド値を求めるために次のメソッドが用意されている.
Object[] getFieldValues(ServiceTemplate tmpl, int setIndex, String field) throws NoSuchFieldException, RemoteException;
- (6) サービス型検索メソッド getServiceTypes()
-
指定されたサービス・テンプレートにマッチするすべてのサービス型を重複なしに求めるために次のメソッドが用意されている.
Class[] getServiceTypes(ServiceTemplate tmpl, String prefix) throws RemoteException;
- (7) サービス ID 検索メソッド getServiceID()
-
サービス ID をかえす.
ServiceID getServiceID();
- (8) LookupLocator 検索メソッド getLocator()
-
LookupLocator をかえす.
LookupLocator getLocator() throws RemoteException;
- (9) グループ検索メソッド getGroups()
-
当該ルックアップサービスが現在所属しているグループを求める.
String[] getGroups() throws RemoteException;
他のインタフェースやメソッドに関する説明は省略する.
JiniME
標準の Jini は Java SE (Standard Edition) の使用を前提としているが,モバイル機器のための JiniME (Jini Micro Edition) もあり,これは Java ME (Micro Edition) 上で動作する.資源が限られたモバイル機器上で動作させるため JiniME の機能は限られているが,JiniME を標準の Jini と連携させるための Jini Bridge も規定されている.