Show Table of Contents
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
を介して外部のコンテキストを検索する場合、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.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");