8.5.3. org.jboss.naming.ExternalContext MBean
ExternalContext MBean は、外部の JNDI コンテキストを JBoss サーバーのJNDI 名前空間に連携することができます。外部とは、JBoss サーバー VM の内部で動作する JBossNS ネーミングサービスの外部にあるネーミングサービスを指しています。JNDI プロバイダの root コンテキストがシリアル化されていない場合でも、LDAP サーバー、ファイルシステム、DNS サーバーなどを組み込むことができます。ネーミングサービスがリモートアクセスに対応している場合、リモートクライアントに対してもこの連携を用意することができます。
外部の JNDI ネーミングサービスを組み込むには、
ExternalContext MBean サービスの設定をjboss-service.xml 設定ファイルに追加する必要があります。ExternalContext サービスの設定可能な属性は以下の通りです。
- JndiName: 外部コンテキストがバインドされる JNDI 名。
- RemoteAccess: リモートクライアントが外部の
InitialContextを作成できるように、Serializableフォームを使って外部のInitialContextをバインドする必要があるかを示すboolean フラグ。リモートクライアントが JBoss JNDIInitialContextを介して外部のコンテキストを検索する場合、ExternalContextMBeanに渡したものと同じ env プロパティを使い、外部のInitialContextのインスタンスを効果的に作成します。クライアントがnew InitialContext(env)をリモートから実行できる場合のみ、機能します。これには、コンテキストにアクセスしているリモート VM にて、env のContext.PROVIDER_URL値が解決できなければなりません。これは、LDAP の例で機能するはずです。しかし、ファイルシステムの例では、ファイルシステムのパスが共通のネットワークパスを指定していない限り機能しない場合が多いでしょう。このプロパティが設定されていないと、デフォルトでFalse に設定されます。 - CacheContext:
cacheContextフラグ。True に設定されている場合、MBean の起動後 MBean が停止するまで in memory オブジェクトとして格納されているときにのみ、外部のContextが作成されます。cacheContext が false に設定されている場合、MBean プロパティとInitialContext クラスを使って検索する度に外部のContextが作成されます。クライアントがキャッシュされていないContextを検索する場合、このクライアントは Context 上でclose()を呼び出し、リソース漏れを防ぐはずです。 - InitialContext: 使用する
InitialContext実装の完全修飾クラス名。以下のいずれかである必要があります:javax.naming.InitialContext,javax.naming.directory.InitialDirContextあるいはjavax.naming.ldap.InitialLdapContext。InitialLdapContextの場合、nullControlsアレイを使用します。デフォルトは、javax.naming.InitialContexとなっています。 - Properties:
Properties属性には 外部のInitialContextに対する JNDI プロパティが含まれます。ここでの入力値はjndi.propertiesファイルに入るテキストと同等のものでなければなりません。 - PropertiesURL: 外部のプロパティファイルから外部の
InitialContextに対するjndi.properties情報を設定します。これは、URL、文字列あるいはクラスパスのリソース名となっており、以下に例を示します。- file:///config/myldap.properties
- http://config.mycompany.com/myldap.properties
- /conf/myldap.properties
- myldap.properties
以下のMBean 定義では、
external/ldap/jboss名の配下で、外部の LDAP コンテキストをJBoss JNDI名前空間にバインドしています。
<!-- Bind a remote LDAP server -->
<mbean code="org.jboss.naming.ExternalContext"
name="jboss.jndi:service=ExternalContext,jndiName=external/ldap/jboss">
<attribute name="JndiName">external/ldap/jboss</attribute>
<attribute name="Properties">
java.naming.factory.initial=com.sun.jndi.ldap.LdapCtxFactory
java.naming.provider.url=ldap://ldaphost.jboss.org:389/o=jboss.org
java.naming.security.principal=cn=Directory Manager
java.naming.security.authentication=simple
java.naming.security.credentials=secret
</attribute>
<attribute name="InitialContext"> javax.naming.ldap.InitialLdapContext </attribute>
<attribute name="RemoteAccess">true</attribute>
</mbean>
この設定では、以下のコードを使ってJBoss VM内から
ldap://ldaphost.jboss.org:389/o=jboss.org にある外部のLDAP にアクセスすることができます。
InitialContext iniCtx = new InitialContext();
LdapContext ldapCtx = iniCtx.lookup("external/ldap/jboss");
この場合、
RemoteAccess プロパティが true に設定されたため、JBoss サーバー VMの外部にある同じコードを利用すると動作します。False に設定されている場合、リモートクライアントは、外部の InitialContext を再構築できない ObjectFactory と共にReference オブジェクトを受け取るため、動作しません。
<!-- Bind the /usr/local file system directory -->
<mbean code="org.jboss.naming.ExternalContext"
name="jboss.jndi:service=ExternalContext,jndiName=external/fs/usr/local">
<attribute name="JndiName">external/fs/usr/local</attribute>
<attribute name="Properties">
java.naming.factory.initial=com.sun.jndi.fscontext.RefFSContextFactory
java.naming.provider.url=file:///usr/local
</attribute>
<attribute name="InitialContext">javax.naming.IntialContext</attribute>
</mbean>
この設定は、ローカルのファイルシステムディレクトリ
/usr/local をexternal/fs/usr/local名配下にあるJBoss JNDI名前空間へバインディングしています。
この設定では、以下のコードを使って JBoss VM 内から
file:///usr/local にある外部のファイルシステムコンテキストへアクセス可能です。
InitialContext iniCtx = new InitialContext();
Context ldapCtx = iniCtx.lookup("external/fs/usr/local");