8.4. HTTP 経由の JNDI
ソケットブートストラッププロトコルを持つレガシーな RMI/JRMP に加え、JBoss は HTTP 経由の JNDI ネーミングサービスへのアクセスに対するサポートも提供しています。
8.4.1. HTTP 経由で JNDI にアクセス
この機能は、
http-invoker.sar により提供されており、http-invoker.sar の構造は以下の通りです。
http-invoker.sar
+- META-INF/jboss-service.xml
+- invoker.war
| +- WEB-INF/jboss-web.xml
| +- WEB-INF/classes/org/jboss/invocation/http/servlet/InvokerServlet.class
| +- WEB-INF/classes/org/jboss/invocation/http/servlet/NamingFactoryServlet.class
| +- WEB-INF/classes/org/jboss/invocation/http/servlet/ReadOnlyAccessFilter.class
| +- WEB-INF/classes/roles.properties
| +- WEB-INF/classes/users.properties
| +- WEB-INF/web.xml
| +- META-INF/MANIFEST.MF
+- META-INF/MANIFEST.MF
jboss-service.xml 記述子は、HttpInvoker と HttpInvokerHA MBean を定義します。これらのサービスは、HTTP経由でJMX バスにある適切な対象の MBean へ送信されるメソッド呼出しルーティングを処理します。
http-invoker.war Web アプリケーションには、HTTP トランスポートの詳細を処理するサーブレットが含まれています。NamingFactoryServlet は、JBoss JNDIネーミングサービス javax.naming.Context 実装に対する作成リクエストを処理します。InvokerServlet は、RMI/HTTP クライアントによる呼出しを処理します。ReadOnlyAccessFilter により、JNDIネーミングサービスのセキュリティを確保し、未認証のクライアントに読み取り専用のアクセスを提供する JNDI コンテキストを作成することができるようになります。

図8.2 JNDI コンテキストに対する HTTP invoker のプロキシ/サーバーの構成
設定について説明する前に、
http-invoker サービスの操作について見てみましょう。図8.2「JNDI コンテキストに対する HTTP invoker のプロキシ/サーバーの構成」 で、JBoss JNDIプロキシの構造とJBoss サーバー側のhttp-invokerコンポーネントとの関係に関する論理的な見解を示しています。このプロキシは、Context.INITIAL_CONTEXT_FACTORYプロパティがorg.jboss.naming.HttpNamingContextFactoryに設定され、Context.PROVIDER_URLプロパティがNamingFactoryServletのHTTP URL に設定されているInitialContext を使い、NamingFactoryServlet から取得します。結果として出たプロキシは Context 実装を提供するorg.jnp.interfaces.NamingContext インスタンスに組み込まれます。
プロキシは
org.jboss.invocation.http.interfaces.HttpInvokerProxyのインスタンスで、org.jnp.interfaces.Namingインターフェースを実装します。内部的にHttpInvokerProxy は、HTTP ポスト経由で Naming インターフェースメソッド呼出しをInvokerServlet にマーシャルする invoker を含みます。InvokerServlet は、これらのポストを JMX 呼出しをNamingServiceに変換し、HTTP ポストのレスポンスにて呼出しの応答をプロキシに返します。
設定値によっては、これらのコンポーネントをすべて連携させるよう設定する必要があります。図8.3「設定ファイルと JNDI/HTTP コンポーネント間の関係」で、設定ファイルと該当のコンポーネントの関係を示しています。

図8.3 設定ファイルと JNDI/HTTP コンポーネント間の関係
http-invoker.sar/META-INF/jboss-service.xml 記述子は、NamingServiceのHttpInvokerProxy を作成するHttpProxyFactory を定義します。HttpProxyFactory に対する設定が必要な属性には以下が含まれます:
- InvokerName:
conf/jboss-service.xml記述子にて定義されるNamingServiceのJMXObjectName。JBoss ディストリビューションで使用される標準設定はjboss:service=Naming。 - InvokerURL あるいは InvokerURLPrefix + InvokerURLSuffix + UseHostName:完全な HTTP URL を
InvokerURL属性を使い、InvokerServletに指定することができます。あるいは、URLのホスト名に依存しない部分を特定し、HttpProxyFactoryを入力できます。InvokerURL値の例として、http://jbosshost1.dot.com:8080/invoker/JMXInvokerServletなどが挙げられます。これは以下に分割できます。- InvokerURLPrefix: ホスト名の前につく URL のプレフィックス。通常、
http://あるいはhttps://(SSL が使われている場合) となっています。 - InvokerURLSuffix: ホスト名の後につくURL のサフィックス。これには Web サーバーのポート番号、
InvokerServletにデプロイされるパスが含まれます。例えば、InvokerURLSuffixのInvokerURLの値は、引用符なしの:8080/invoker/JMXInvokerServletとなります。ポート番号は Web コンテナサービス設定により決まります。InvokerServletへのパスは、http-invoker.sar/invoker.war/WEB-INF/web.xmlの記述子にて指定されます。 - UseHostName: 完全
InvokerURLのホスト名部分を構築する際、ホスト名をホスト IP アドレスの位置に使用するか示すフラグ。True の場合、InetAddress.getLocalHost().getHostNameメソッドが使われます。True でなければ、InetAddress.getLocalHost().getHostAddress()メソッドが利用されます。
- ExportedInterface: プロキシがクライアントに対し公開する
org.jnp.interfaces.Namingインターフェース。このプロキシの実際のクライアントは、JBoss JNDI実装のNamingContextクラスで、JBoss JNDIプロバイダーを使う場合、JNDI クライアントはInitialContextルックアップから取得します。 - JndiName: プロキシがバインドされる場合の JNDI の名前。このインターフェースが JNDI にバインドされないように、この項目はブランク/空の文字列に設定する必要があります。JNDI を使ってそれ自体をブートストラップすることはできません。これは、
NamingFactoryServletの役割になります。
http-invoker.sar/invoker.war/WEB-INF/web.xml 記述子は、初期化パラメーターと共にNamingFactoryServlet と InvokerServlet のマッピングを定義します。JNDI/HTTP に関連するNamingFactoryServletの設定は JNDIFactory のエントリで以下を定義します。
HttpProxyFactoryMBean 名をマッピングするnamingProxyMBeanの初期化パラメーター。HTTP ポストへの応答時に返すNamingプロキシを取得するために、NamingFactoryServletがこのパラメーターを利用します。デフォルトのhttp-invoker.sar/META-INF/jboss-service.xml設定は、名前がjboss:service=invoker,type=http,target=Namingとなります。- Naming プロキシ値をクエリするための
namingProxyMBean属性名を定義するプロキシ初期化パラメーター。属性名がProxyにデフォルト設定されています。 JNDIFactory設定のサーブレットマッピング。セキュリティー保護されていないマッピングのデフォルト設定は/JNDIFactory/*となっています。これは、http-invoker.sar/invoker.warのコンテキスト root を起点とした相対パスでデフォルトでは、.warのサフィックスを取ったWAR名となっています。
JNDI/HTTPに関連する
InvokerServlet 設定は JMXInvokerServlet で以下を定義します。
InvokerServletのサーブレットマッピング。セキュリティ保護されていないマッピングのデフォルト設定は/JMXInvokerServlet/*で、これは、http-invoker.sar/invoker.warのコンテキスト root を起点とした相対パスでデフォルトでは、.warのサフィックスを取ったWAR名となっています。