プライマリ・コンテンツに移動
Oracle® Fusion Middleware WebLogic Server Multitenantの使用
12c (12.2.1.3.0)
E90313-02
目次へ移動
目次

前
次

16 JNDIの構成とプログラミング

パーティション・ドメイン(リソース・スコープでオブジェクトベースのパーティション関連付け、パーティション情報のバインディングと取得、パーティション上のリソースへのアクセス、パーティションでクラスタ化されたJNDIなど)でのJNDIのプログラミングを含め、Oracle WebLogic Server Multitenant (MT)の外部Java Naming and Directory (JNDI)プロバイダを構成する方法について理解します。

この章の内容は次のとおりです。

外部JNDIプロバイダの構成: 概要

WebLogic Serverは外部JNDI APIを備えており、これを使用するとリモートJNDIツリーに直接接続しなくてもそのリモート・ツリー上のオブジェクトにアクセスできます。パーティション環境では、JNDIツリー上のオブジェクトにローカル・アクセスすることも(同じマシン上の別のパーティションで)、リモートからアクセスすることもできます。

別のパーティションのプロパティを指定して外部JNDIプロバイダを作成して構成すると、パーティションの外部に存在するオブジェクトをルックアップして使用できます。外部JNDIプロバイダに対して設定したプロパティを使用して新しいコンテキストが作成され、これが内部的に実際のルックアップとバインドの操作を行います。

外部JNDIプロバイダの構成: 前提条件

パーティション用の外部JNDIプロバイダを作成して構成する前に、特定の前提手順を実行する必要があります。

  1. 1つ以上の仮想ターゲットを作成します。「仮想ターゲットの構成」を参照してください
  2. パーティション内の外部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コンテキスト認証は、コンテキストの作成時に行われます。WebLogic Server JNDIは、現在のパーティションではなく、プロバイダURLが関連付けられているパーティションで認証が処理されていることを確認します。コンテキストの作成時にプロバイダURLが設定されない場合、現在のパーティションに関連付けられたセキュリティ・レルムで認証が処理されます。認証済のコンテキストはスレッド・コンテキストにプッシュされ、以降の操作ではそのコンテキストで権限チェックが行われます。

パーティション環境でのクラスタ化JNDI

クラスタを表すJNDIツリーは、クライアントからは単一のグローバル・ツリーとして認識されます。クラスタ全体のサービスが存在するツリーは、実際にはクラスタ内の各WebLogic Serverインスタンスまたはパーティションにレプリケートされます。

マルチテナント環境で、レプリケート・バインドをJNDIリソースに設定すると、バインド、アンバインドおよび再バインドのイベントは、すべてのクラスタ・ノードに公開されます。

パーティションJNDIリソースのライフサイクル

WebLogic Serverは、パーティション・ライフサイクルに従って、パーティションJNDIリソースのライフサイクルを維持します。

  • パーティションが作成されて起動されると、パーティションJNDIツリーがパーティション・ルート・ノードとともに作成されて、使用可能な状態になります。

  • パーティションが停止されると、パーティションJNDIツリー全体が削除されます。

外部JNDIプロバイダの作成: 関連タスクおよびリンク