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 記述子は、HttpInvokerHttpInvokerHA MBean を定義します。これらのサービスは、HTTP経由でJMX バスにある適切な対象の MBean へ送信されるメソッド呼出しルーティングを処理します。
http-invoker.war Web アプリケーションには、HTTP トランスポートの詳細を処理するサーブレットが含まれています。NamingFactoryServlet は、JBoss JNDIネーミングサービス javax.naming.Context 実装に対する作成リクエストを処理します。InvokerServlet は、RMI/HTTP クライアントによる呼出しを処理します。ReadOnlyAccessFilter により、JNDIネーミングサービスのセキュリティを確保し、未認証のクライアントに読み取り専用のアクセスを提供する JNDI コンテキストを作成することができるようになります。
JNDI コンテキストに対する HTTP invoker のプロキシ/サーバーの構成

図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 コンポーネント間の関係」で、設定ファイルと該当のコンポーネントの関係を示しています。
設定ファイルと JNDI/HTTP コンポーネント間の関係

図8.3 設定ファイルと JNDI/HTTP コンポーネント間の関係

http-invoker.sar/META-INF/jboss-service.xml 記述子は、NamingServiceHttpInvokerProxy を作成するHttpProxyFactory を定義します。HttpProxyFactory に対する設定が必要な属性には以下が含まれます:
  • InvokerName: conf/jboss-service.xml記述子にて定義される NamingService のJMX ObjectName。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にデプロイされるパスが含まれます。例えば、InvokerURLSuffixInvokerURL の値は、引用符なしの: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 記述子は、初期化パラメーターと共にNamingFactoryServletInvokerServlet のマッピングを定義します。JNDI/HTTP に関連するNamingFactoryServletの設定は JNDIFactory のエントリで以下を定義します。
  • HttpProxyFactory MBean 名をマッピングする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名となっています。