21.2. クライアントの設定

クライアントが HA-JNDI を使用するよう設定するには、 新しい InitialContext が作成された時に適切なネーミングプロパティ環境が使用できるようにします。 この方法は、 クライアントが JBoss Enterprise Application Platform 内で実行されているか別の VM で実行されているかによって異なります。

21.2.1. Enterprise Application Platform 内部で実行されているクライアントの場合

Enterprise Application Platform 内部から HA-JNDI にアクセスしたい場合、 JNDI プロパティをコンストラクターに渡して明示的に InitialContext を設定する必要があります。 次のコードは HA-JNDI にバインドされたネーミングコンテキストの作成方法について示しています。
Properties p = new Properties();  
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");  
p.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");
// HA-JNDI is listening on the address passed to JBoss via -b  
String bindAddress = System.getProperty("jboss.bind.address", "localhost");
p.put(Context.PROVIDER_URL, bindAddress + ":1100"); // HA-JNDI address and port.  
return new InitialContext(p);
Context.PROVIDER_URL プロパティは deploy/cluster/hajndi-jboss-beans.xml ファイルに設定された HA-JNDI サービスを示しています (「JBoss の設定」 を参照)。 デフォルトでは、 このサービスは jboss.bind.address システムプロパティより命名されたインターフェースをリッスンします。 jboss.bind.address システムプロパティは、 JBoss Enterprise Application Platform 起動時に -b コマンドラインオプションへ割り当てた値に設定されます (指定がない場合は localhost)。 上記のコードはこのプロパティへのアクセス例になります。
しかし、 すべての場合で動作するわけではなく、 特に複数の JBoss Enterprise Application Platform インスタンスを同じマシン上で実行し、 同じ IP アドレスへバインドし、 異なるポートを使用するよう設定した場合は動作しません。 下記のように Context.PROVIDER_URL を指定せず、 jnp.partitionName プロパティを指定して InitialContext が VM 内の HA-JNDI を静的に見つけるようにするのが最も安全なやり方です。
Properties p = new Properties();
p.put(Context.INITIAL_CONTEXT_FACTORY, "org.jnp.interfaces.NamingContextFactory");
p.put(Context.URL_PKG_PREFIXES, "jboss.naming:org.jnp.interfaces");
// HA-JNDI is registered under the partition name passed to JBoss via -g  
String partitionName = System.getProperty("jboss.partition.name", "DefaultPartition");
p.put("jnp.partitionName", partitionName);
return new InitialContext(p);
この例は jboss.partition.name システムプロパティを使用して、 HA-JNDI サービスが動作するパーティションを特定します。 このシステムプロパティは、 JBoss Enterprise Application Platform 起動時に -g コマンドラインオプションへ割り当てた値に設定されます (指定がない場合は DefaultPartition)。
jndi.properties ファイルをデプロイメントに配置し、Enterprise Application Platform の conf/jndi.properties ファイルを編集して作業を単純化しないようにしてください。 いずれの場合でもほぼ間違いなくアプリケーションが破損し、場合によってはサーバー全体が破損します。 クライアント設定を外部化するには、 jndi.properties という名前でないプロパティファイルをデプロイし、 そのファイルの内容をロードする Properties オブジェクトをプログラムを使用して作成するのが 1 つの方法です。

21.2.1.1. EJB および WAR からのHA-JNDI リソースへのアクセス -- 環境ネーミングコンテキスト

HA-JNDI が EJB またはサーブレットである場合、 リソースのルックアップを設定する最も危害を少なくする方法は、ルックアップを実行する Bean や Web アプリケーションの環境ネーミングコンテキストへリソースをバインドすることです。 ローカルマッピングでなく HA-JNDI を使用するようバインディングを設定することができます。 JMS 接続ファクトリとキューの例は次の通りです (最も一般的なユースケースとなります)。
ejb-jar.xml の Bean 定義や war の web.xml 内で、 接続ファクトリと送信先の 2 つのリソース参照マッピングを定義する必要があります。
<resource-ref>
 <res-ref-name>jms/ConnectionFactory</res-ref-name>
 <res-type>javax.jms.QueueConnectionFactory</res-type>
 <res-auth>Container</res-auth>
</resource-ref>
 
<resource-ref>
 <res-ref-name>jms/Queue</res-ref-name>
 <res-type>javax.jms.Queue</res-type>
 <res-auth>Container</res-auth>
</resource-ref>
これらの例を使用して、 ルックアップを実行する Beanは java:comp/env/jms/ConnectionFactory をルックアップして接続ファクトリを取得し、 java:comp/env/jms/Queue をルックアップしてキューを取得できます。
JBoss 固有の配備記述子 (EJB は jboss.xml、 WAR は jboss-web.xml) の中でこれらの参照を HA-JNDI が使用する URL へマップする必要があります。
<resource-ref>
 <res-ref-name>jms/ConnectionFactory</res-ref-name>
 <jndi-name>jnp://${jboss.bind.address}:1100/ConnectionFactory</jndi-name>
</resource-ref>
 
<resource-ref>
 <res-ref-name>jms/Queue</res-ref-name>
 <jndi-name>jnp://${jboss.bind.address}:1100/queue/A</jndi-name>
 </resource-ref>
URL は、 Bean と同じノード上で稼働している HA-JNDI サーバーへの URL になります。 Bean が利用できる場合、 ローカル HA-JNDI サーバーも利用できるはずです。 ルックアップはクラスターの全ノードを自動的にクエリし、JMS リソースを持つノードを特定します。
上記で使用される ${jboss.bind.address} 構文は、 URL を判定する時に jboss.bind.address システムプロパティの値を使用するよう JBoss に伝えます。 このシステムプロパティは、 JBoss Enterprise Application Platform の起動時に -b コマンドラインオプションで割り当てた値をシステムプロパティ自体に設定します。

21.2.1.2. 単に jndi.properties ファイルに指定するのではなく、 プログラムを使用して行う理由

JBoss Enterprise Application Platform の内部ネーミング環境は、 編集してはならない conf/jndi.properties ファイルによって制御されます。
Enterprise Application Platform 内に他の jndi.properties ファイルをデプロイしないでください。 他のファイルをデプロイすると、 jndi.properties ファイルがあってはならないクラスパス上に存在してしまうことがあるため、 サーバーの内部操作を妨害する可能性があります。 例えば、 HA-JNDI に設定された jndi.properties が EJB デプロイメントに含まれる場合、 サーバーが EJB プロキシを JNDI へバインドすると、 プロキシが属するローカル JNDI ツリーではなく、レプリケートされた HA-JNDI ツリーにバインドする可能性が高いでしょう。

21.2.1.3. 正しくない HA-JNDI へバインドされたことを知る方法

jmx コンソールにて、jboss:service=JNDIView MBean 上で list 操作を実行します。結果の最後の方に「HA-JNDI Namespace」の内容が一覧表示されます。 通常、一覧には何も表示されませんが、 明示的にバインドしなかったデプロイメントが表示された場合、 不適切な jndi.properties ファイルがクラスパスにあると考えられられます。例は、Problem with removing a Node from Cluster を参照してください。