8.3. Naming IntialContext ファクトリ

JBoss JNDI プロバイダーは現在、様々なInitialContext ファクトリ実装に対応しています。

8.3.1. 標準のネーミングコンテキストファクトリ

最もよく使われるファクトリは、org.jnp.interfaces.NamingContextFactory実装で、このプロパティには以下が含まれます。
  • java.naming.factory.initial: 最初に使うコンテキストファクトリを指定するための環境プロパティ名。プロパティの値は、最初のコンテキストを作成するファクトリクラスの完全修飾クラス名にする必要があります。これが指定されていない場合、InitialContext オブジェクトが作成されるとjavax.naming.NoInitialContextException がスローされます。
  • java.naming.provider.url: クライアントが使う JBoss JNDI サービスプロバイダーの場所を指定するための環境プロパティ名。NamingContextFactory クラスはこの情報を使いどの JBossNS サーバーに接続するかを把握します。このプロパティの値はURL文字列としてください。JBossNSでは、URL 形式はjnp://host:port/[jndi_path]となっています。URL の jnp: の部分はプロトコルで、これは JBoss が使うソケット/RMI ベースのプロトコルを参照します。URL のjndi_path の部分は、root コンテキストを起点としたオプションのJNDI名となっています (例:appsapps/tmp)。ホストコンポーネント以外はすべてオプションとなっています。デフォルトのポート値が 1099 であるため、以下の例はすべて同じです。
    • jnp://www.jboss.org:1099/
    • www.jboss.org:1099
    • www.jboss.org
  • java.naming.factory.url.pkgs: URL コンテキストファクトリでローディングする際に使うパッケージプレフィックス一覧を指定するための環境プロパティ名。このプロパティの値はファクトリクラスのクラス名につけるプレフィックス一覧をコンマで区切るものとします。このファクトリクラスは、URL コンテキストファクトリを作成します。JBoss JNDI プロバイダーでは、これは org.jboss.naming:org.jnp.interfaces でなければなりません。このプロパティは、JBoss JNDI プロバイダーのjnp:java: URL コンテキストファクトリを検索する際に必須となっています。
  • jnp.socketFactory: ブートストラップソケットを作成するのに利用する javax.net.SocketFactory 実装の完全修飾クラス名。デフォルト値は、org.jnp.interfaces.TimedSocketFactoryで、TimedSocketFactory は、接続と読み込みタイムアウトの使用に対応する単純な SocketFactory 実装となっています。この2つのプロパティは以下により指定されます。
  • jnp.timeout: 接続のタイムアウト(ミリ秒単位)。デフォルト値が0の場合、VM TCP/IP がタイムアウトするまで、接続が停止されます。
  • jnp.sotimeout: 接続されたソケットの読み込みタイムアウト (ミリ秒単位)。デフォルト値が0の場合、読み込みが停止します。これは新しく接続されたソケットでSocket.setSoTimeout に渡される値となっています。
クライアントがこれらの利用可能なJBossNS プロパティを使って InitialContext を作成するとorg.jnp.interfaces.NamingContextFactory オブジェクトを使い今後の操作で利用されるContext インスタンスを作成します。NamingContextFactoryjavax.naming.spi.InitialContextFactory インターフェースのJBossNS 実装となっており、 NamingContextFactory クラスにContextを作成が求められると、グローバル JNDI 名前空間にあるコンテキスト名とInitialContext 環境を使い org.jnp.interfaces.NamingContextインスタンスを作成します。NamingContext インスタンスが実際にJBossNS サーバーに接続するタスクを実行し、 Context インターフェースを実装しています。この環境からのContext.PROVIDER_URL 情報は、どのサーバーからNamingServer RMI 参照を取得するか示しています。
NamingContext インスタンスとNamingServer インスタンスの紐付けは、最初の Context 操作が実行される際に遅延モードで行われます。Context 操作が実行されNamingContext に紐付けられている NamingServer がない場合、その環境プロパティがContext.PROVIDER_URLを定義しているかどうか確認します。Context.PROVIDER_URL は、Context が使う予定の JBossNS サーバーのホストとポートを定義します。プロバイダ URL がある場合、NamingContextNamingContext クラスの静的マップを確認することで、まずホストとポートの組み合わせで入力される Naming インスタンスがすでに作成されていないか確認します。ホストとポートのペアでインスタンスがすでに取得されている場合、単に既存のNaming インスタンスを使います。該当のホストとポートに対して、Naming インスタンスがすでに作成されていない場合、NamingContextjava.net.Socketを使ってホストとポートを接続し、ソケットからjava.rmi.MarshalledObject を読み込み、get メソッドを呼び出すことでサーバーからNaming RMI スタブをリトリーブします。新しく取得したNaming インスタンスは、ホストとポートの組み合わせ配下にある NamingContext サーバーマップでキャッシュ化されます。コンテキストが紐付けられた JNDI 環境にてプロバイダー URL が指定されていない場合、NamingContext は単にMain MBean で設定された VM Naming インスタンスを使用します。
Context インターフェースの NamingContext 実装は、全操作を NamingContext に紐付けられた Naming インスタンスに委譲します。Naming インターフェースを実装する NamingServer クラスはContext ストアとして java.util.Hashtable を使用します。特定の JBossNS サーバーに対する JNDI 名はそれぞれ違っており、各 JNDI 名に固有のNamingServerが1つずつ存在します。NamingServer インスタンスを参照する時点で有効になる一時的な NamingContext インスタンスは 0 またはそれ以上存在します。NamingContext の目的は、NamingContextに渡される JNDI 名の変換を管理する Naming インターフェースアダプターに対し Context として動作することです。JNDI名は相対あるいは URL になり得るので、参照先の JBossNS サーバーのコンテキスト内で絶対名に変換される必要があります。この変換はNamingContext の主要機能となります。