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 JNDI InitialContext を介して外部のコンテキストを検索する場合、ExternalContext MBeanに渡したものと同じ 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.InitialLdapContextInitialLdapContextの場合、null Controls アレイを使用します。デフォルトは、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/localexternal/fs/usr/local名配下にあるJBoss JNDI名前空間へバインディングしています。
この設定では、以下のコードを使って JBoss VM 内から file:///usr/local にある外部のファイルシステムコンテキストへアクセス可能です。
InitialContext iniCtx = new InitialContext();
                Context ldapCtx = iniCtx.lookup("external/fs/usr/local");