16 JNDIの構成とプログラミング
パーティション・ドメイン(リソース・スコープでオブジェクトベースのパーティション関連付け、パーティション情報のバインディングと取得、パーティション上のリソースへのアクセス、パーティションでクラスタ化されたJNDIなど)でのJNDIのプログラミングを含め、Oracle WebLogic Server Multitenant (MT)の外部Java Naming and Directory (JNDI)プロバイダを構成する方法について理解します。
注意:
WebLogic Server Multitenantドメイン・パーティション、リソース・グループ、リソース・グループ・テンプレート、仮想ターゲットおよびリソース消費管理は、WebLogic Server 12.2.1.4.0で非推奨になり、次のリリースで削除されます。この章の内容は次のとおりです。
外部JNDIプロバイダの構成: 概要
WebLogic Serverは外部JNDI APIを備えており、これを使用するとリモートJNDIツリーに直接接続しなくてもそのリモート・ツリー上のオブジェクトにアクセスできます。パーティション環境では、JNDIツリー上のオブジェクトにローカル・アクセスすることも(同じマシン上の別のパーティションで)、リモートからアクセスすることもできます。
別のパーティションのプロパティを指定して外部JNDIプロバイダを作成して構成すると、パーティションの外部に存在するオブジェクトをルックアップして使用できます。外部JNDIプロバイダに対して設定したプロパティを使用して新しいコンテキストが作成され、これが内部的に実際のルックアップとバインドの操作を行います。
外部JNDIプロバイダの構成: 前提条件
パーティション用の外部JNDIプロバイダを作成して構成する前に、特定の前提ステップを実行する必要があります。
- 1つ以上の仮想ターゲットを作成します。「仮想ターゲットの構成」を参照してください
- パーティション内の外部JNDIプロバイダのスコープとして使用するリソース・グループをそのパーティション内に作成します。このリソース・グループを作成するときに、1つ以上の使用可能なターゲットをリソース・グループに対して選択します。「リソース・グループの作成: 主なステップおよび例」を参照してください。
外部JNDIプロバイダの構成: 主なステップ
パーティション用の外部JNDIプロバイダを構成する手順は、ドメイン用の構成手順と同じですが、いくつかの例外があります。
-
外部JNDIプロバイダのスコープをパーティションのリソース・グループに設定します。
-
外部JNDIプロバイダが別のマシン上のパーティションに存在する場合、共通のリモート・クライアントであるかのようにプロバイダURLを設定します。たとえば、t3プロトコルの場合、
t3://
hostname:port
/
partition_name
となります。
外部JNDIプロバイダの構成を完了するには、ローカルのJNDI名とリモート・ノード上のJNDI名とを関連付けるための1つ以上の外部JNDIリンクを作成します。
外部JNDIプロバイダの作成: WLSTの例
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()
パーティション環境でのJNDIのプログラミング
パーティション環境でのJNDIプログラミングのときに留意する必要のある主な点を、非パーティション環境と比較しながら理解します。
JNDIのプログラミングの追加情報は、『Oracle WebLogic Server JNDIアプリケーションの開発』を参照してください。
パーティション・スコープとドメイン・スコープの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リソースへのリモートおよびパーティションをまたがるアクセス
パーティションJNDIリソースには、リモートのスタンドアロンJavaコードから、WebLogic ServerクライアントまたはリモートのWebLogic Serverインスタンスに存在するコードを使用してアクセスできます。このようにするには、リモートの単一サーバーJNDIツリーにアクセスするときと同様にプロバイダURLを設定します。
また、WebLogic Server JNDIは、あるパーティションがローカルJNDI名のみを宣言できるように外部JNDIプロバイダを拡張しますが、実際は他のパーティションJNDIリソースを指しています。リンク・エントリを構成してローカルJNDI名とパーティションJNDIリソースとを関連付けることができます。
パーティション環境でのクラスタ化JNDI
クラスタを表すJNDIツリーは、クライアントからは単一のグローバル・ツリーとして認識されます。クラスタ全体のサービスが存在するツリーは、実際にはクラスタ内の各WebLogic Serverインスタンスまたはパーティションにレプリケートされます。
マルチテナント環境で、レプリケート・バインドをJNDIリソースに設定すると、バインド、アンバインドおよび再バインドのイベントは、すべてのクラスタ・ノードに公開されます。