この章の内容は次のとおりです。
WebLogic Serverは外部JNDI APIを備えており、これを使用するとリモートJNDIツリーに直接接続しなくてもそのリモート・ツリー上のオブジェクトにアクセスできます。
パーティション環境では、JNDIツリー上のオブジェクトにローカル・アクセスすることも(同じマシン上の別のパーティションで)、リモートからアクセスすることもできます。
別のパーティションのプロパティを指定して外部JNDIプロバイダを作成して構成すると、パーティションの外部に存在するオブジェクトをルックアップして使用できます。外部JNDIプロバイダに対して設定したプロパティを使用して新しいコンテキストが作成され、これが内部的に実際のルックアップとバインドの操作を行います。
パーティションの外部JNDIプロバイダを作成および構成する前に、次を行う必要があります。
パーティション用の外部JNDIプロバイダを構成する手順は、ドメイン用の構成手順と同じですが、次の例外があります。
外部JNDIプロバイダのスコープをパーティションのリソース・グループに設定します。
外部JNDIプロバイダが別のマシン上のパーティションに存在する場合、共通のリモート・クライアントであるかのようにプロバイダURLを設定します。たとえば、t3プロトコルの場合、t3://
hostname:port
/
partition_name
となります。
外部JNDIプロバイダの構成を完了するには、ローカルのJNDI名とリモート・ノード上のJNDI名とを関連付けるための1つ以上の外部JNDIリンクを作成します。
次の例に、WebLogic Scripting Tool (WLST)を使用して外部JNDIプロバイダを作成し、プロバイダのユーザー名、パスワード、プロバイダURLおよびInitialContextFactory
を構成する方法を示します。このプロバイダの外部JNDIリンクを作成する方法も示します。
# Connect to the Administration Server connect('adminusername','adminpassword','t3://hostname:port') # Start an edit session edit() startEdit() # Change to the appropriate resource group directory for the partition for which # you are creating the foreign JNDI provider. cd('/Partitions/partition_name/ResourceGroups/resource_group_name') cmo.createForeignJNDIProvider('provider_name') cd('ForeignJNDIProviders/provider_name') set('Password', 'password') cmo.setUser('username') cmo.setProviderURL('t3://hostname:port') cmo.setInitialContextFactory('initialContextFactory') # Create a foreign JNDI link and configure it cmo.createForeignJNDILink('link_name') cd('ForeignJNDILinks/link_name') cmo.setLocalJNDIName('local_JNDI_name') cmo.setRemoteJNDIName('remote_JNDI_name') save() activate()
WebLogic Server MTは、複数のパーティションを1つのドメイン内で実行することをサポートします。特定のWebLogic Serverインスタンスには、並行して実行中の複数のパーティションがある場合があります。パーティション内のJNDIリソースは、パーティションごとに分離されます。同じJNDI名の複数のJNDIリソースが複数のパーティションに存在することがあります。
この項では、パーティション環境でのJNDIプログラミングのときに留意する必要のある主な点を、非パーティション環境と比較しながら説明します。次のトピックが含まれています:
JNDIのプログラミングの追加情報は、『Oracle WebLogic Server JNDIアプリケーションの開発』を参照してください。
WebLogic Serverでは、グローバルJNDIツリーは1つのみであり、これがグローバルJNDIリソースに対するすべてのリクエストを処理します。ただし、WebLogic Server MTでは、ドメインのグローバルJNDIツリーが1つ存在し、パーティションのそれぞれにグローバルJNDIツリーが1つ存在します。パーティションのJNDIリソースは、デフォルトではそのパーティション自体でのみ使用できますが、「JNDIリソースへのリモートおよびパーティションをまたがるアクセス」で説明しているように、このようなリソースにパーティションをまたいでアクセスできます。そのため、デフォルトでは、パーティション・レベルでデプロイされたアプリケーションは、パーティション内のJNDIリソースにのみアクセスでき、他のパーティションまたはドメインのJNDIリソースにはアクセスできません。
たとえば、グローバルJNDI名がjava:global/foo
であるEJBをドメインにデプロイし、同じサーバー上の複数のパーティションにもデプロイすると、java:global/foo
はこれらのパーティションそれぞれのグローバルJNDIツリーと、ドメインのグローバルJNDIツリーにバインドされます。この結果の動作は、次のようになります。
java:global/foo
のルックアップをパーティションの1つから実行すると、デフォルトでは、そのパーティションのグローバルJNDIツリーにバインドされたインスタンスが返されます。
java:global/foo
のルックアップをドメインから実行すると、ドメインのグローバルJNDIツリーにバインドされたインスタンスが返されます。
他にもいくつかの例を示します。
mail.MedRecMail Session
はパーティションA、パーティションBおよびドメインにバインドされています。JNDIルックアップをパーティションA内のアプリケーションからリクエストするとパーティションAのセッションが返されますが、JNDIルックアップをパーティションB内のアプリケーションからリクエストするとパーティションBのセッションが返されます。ドメイン内にデプロイされたアプリケーションからJNDIルックアップをリクエストすると、ドメインのセッションが返されます。
weblogic.transaction.resources.dsXA
はパーティションBにのみバインドされています。パーティションB内にデプロイされたアプリケーションからルックアップをリクエストすると、RmiDataSource
が返されます。他のパーティションやドメインにデプロイされたアプリケーションからリクエストすると、NameNotFoundException
が返されます。
java:global/wm/default
はドメイン・レベルでのみバインドされています。デフォルトでは、ドメイン内にデプロイされたアプリケーションのみがアクセスできます。
注意:
アプリケーション・スコープJNDIリソースのルックアップやバインドなどのリクエストは、アプリケーションに委任されるため、分離されます。
JNDIコンテキストをパーティションの中で作成すると、コンテキスト・オブジェクトはパーティション・ネームスペースに維持され、それ以降のJNDI操作はすべて、そのパーティションのコンテキストの中で行われます。JNDIコンテキストが作成されると、指定したプロバイダURLプロパティによって、特定のパーティションへの関連付けが確立されます。java.naming.provider.url
プロパティを設定してJNDIコンテキストを作成する場合、JNDIはパーティションを認識するためにパーティション情報をプロバイダURLの値の中で探します。パーティションに対して構成された仮想ターゲットURLをプロバイダとして設定する場合は、JNDIによってそのパーティションのコンテキストが作成され、そのコンテキストからのリクエストはすべてパーティションのJNDIリソースに委任されます。
オブジェクトベースのコンテキストが作成された後、その操作はパーティションJNDIツリーを使用して行われます。
パーティション情報がパーティションのグローバルJNDIツリーにバインドされるのは、パーティション・ツリーが初期化されるときです。コンテキストのパーティション情報を取得するには、次のものをルックアップします。
weblogic.partitionName
、これによってコンテキストベース・パーティションのpartitionNameが返されます。これは、パーティション名またはDomain
(ドメインスコープ・コンテキストの場合)です。
weblogic.partitionId
、これによってパーティションのpartitionId
が返されます。これは、ドメインの場合は0
(ゼロ)、パーティションの場合は0より大きい値になります。
パーティションJNDIリソースには、リモートのスタンドアロンJavaコードから、WebLogic ServerクライアントまたはリモートのWebLogic Serverインスタンスに存在するコードを使用してアクセスできます。このようにするには、リモートの単一サーバーJNDIツリーにアクセスするときと同様にプロバイダURLを設定します。
また、WebLogic Server JNDIは、あるパーティションがローカルJNDI名のみを宣言できるように外部JNDIプロバイダを拡張しますが、実際は他のパーティションJNDIリソースを指しています。リンク・エントリを構成してローカルJNDI名とパーティションJNDIリソースとを関連付けることができます。
クラスタを表すJNDIツリーは、クライアントからは単一のグローバル・ツリーとして認識されます。クラスタ全体のサービスが存在するツリーは、実際にはクラスタ内の各WebLogic Serverインスタンスまたはパーティションにレプリケートされます。
マルチテナント環境で、レプリケート・バインドをJNDIリソースに設定すると、バインド、アンバインドおよび再バインドのイベントは、すべてのクラスタ・ノードに公開されます。