ページの先頭行へ戻る
Interstage Application Server/Interstage Web Server Java EE運用ガイド

3.11.2 環境ネーミングコンテキスト(Environment Naming Context)

ネーミングサービスはシステムで一意の名前でオブジェクトを一元管理する仕組みですが、Java EEではJava EEコンポーネントの汎用性を向上するため、Java EEコンポーネントのdeployment descriptorファイルの定義内容を元に、Java EEコンポーネントごとにオブジェクトを管理するjava:comp/env環境ネーミングコンテキストを提供します。

ここでは、以下について説明します。

環境ネーミングコンテキストの利点

deployment descriptorファイルに定義した参照名(論理的な名前)は、JNDI名(物理的な名前)との対応をInterstage deployment descriptorファイルに定義できます。この対応を定義したJava EEコンポーネントでは、参照名を指定してlookupメソッドを実行することで、その参照名に対応するJNDI名のオブジェクトをlookupできます。Java EEコンポーネントごとに参照名とJNDI名の対応関係が定義でき、環境ネーミングコンテキストが独立しているために以下の利点があります。

実際の環境を意識せずに開発可能

実際に運用する時のJNDI名を意識せずにJava EEコンポーネントを開発できます。このため、一度作成したJava EEコンポーネントは、アプリケーションを修正せずに定義ファイルの変更だけで様々な環境に配布することもできます。

独立してアプリケーション開発可能

Java EEコンポーネント間で同一の参照名を使用していても、アプリケーションの修正を行わずに定義を編集するだけで各Java EEコンポーネントで別々のオブジェクトをlookupメソッドで取得できます。このため、互いのJava EEコンポーネントの名前の重複も意識せずに開発できます。

ネーミングサービスと環境ネーミングコンテキストの関係

以下に、ネーミングサービスと環境ネーミングコンテキストの関係を示します。
以下の図は、IJServerクラスタにJava EEコンポーネント1とJava EEコンポーネント2が存在した場合の例です。Java EEコンポーネント1とJava EEコンポーネント2で参照名「F」が双方に定義されていますが、Java EEコンポーネント1の参照名「F」はJNDI名「X/A」に対応付け、Java EEコンポーネント2の参照名「F」はJNDI名「X/Y/D」に対応付けることで、各Java EEコンポーネントは別々のオブジェクトを参照できます。



環境ネーミングコンテキストで参照可能なオブジェクト

環境ネーミングコンテキストで参照可能なオブジェクトは以下です。合わせて対応するアノテーションを記載します。

参照オブジェクト

JNDIのlookupメソッドに指定する名前

アノテーション

アノテーションに注入された情報

JNDIによるアノテーションに注入された情報の参照」を参照してください。

アプリケーション環境エントリ

java:comp/env/[環境エントリ名]

リモート呼出し用Enterprise JavaBean

java:comp/env/[EJB参照名]

@EJB

ローカル呼出し用Enterprise JavaBean

java:comp/env/[EJBローカル参照名]

@EJB

JDBCリソース

java:comp/env/[リソース参照名]

@Resource

JavaMailセッション

URL接続ファクトリ

JMS接続ファクトリ

コネクタリソース

カスタムリソース

外部リソース

JMS送信先

java:comp/env/[Destination参照名]

@Resource

管理オブジェクトリソース

java:comp/env/[リソース環境参照名]

@Resource

JPAエンティティマネージャファクトリ

java:comp/env/[永続性ユニット参照名]

@PersistenceUnit

コンテナ管理のJPAエンティティマネージャ

java:comp/env/[永続性コンテキスト参照名]

@PersistenceContext

UserTransaction

java:comp/UserTransaction

@Resource

TransactionSynchronizationRegistry

java:comp/TransactionSynchronizationRegistry

@Resource

ORB

java:comp/ORB

@Resource

HandleDelegate

java:comp/HandleDelegate

@Resource

EJBタイマーサービス

java:comp/TimerService

@Resource

EJBコンテキスト

java:comp/EJBContext

@Resource


上記の各参照名とdeployment descriptorファイルの定義項目の対応を以下に記載します。

環境エントリと各参照名

deployment descriptorファイルの定義項目

環境エントリ名

<env-entry>タグの<env-entry-name>タグ値

EJB参照名

<ejb-ref>タグの<ejb-ref-name>タグ値

EJBローカル参照名

<ejb-local-ref>タグの<ejb-ref-name>タグ値

リソース参照名

<resource-ref>タグの<res-ref-name>タグ値

Destination参照名

<message-destination-ref>タグの<message-destination-ref-name>タグ値

リソース環境参照名

<resource-env-ref>タグの<resource-env-ref-name>タグ値

永続性ユニット参照名

<persistence-unit-ref>タグの<persistence-unit-ref-name>タグ値

永続性コンテキスト参照名

<persistence-context-ref>タグの<persistence-context-ref-name>タグ値


JNDIによるアノテーションに注入された情報の参照

アノテーションに注入された情報が登録されます。例えば、com.exampleというパッケージ名のMyAppというクラス名のフィールドで、フィールド名がmyDatabaseというフィールドにJava EEのアノテーションが指定された場合、「java:comp/env/com.example.MyApp/myDatabase」という名前でアノテーションに注入された値が取得できます。

参照名とJNDI名の対応付け

deployment descriptorファイルに定義した参照名(論理的な名前)は、JNDI名(物理的な名前)との対応をInterstage deployment descriptorファイルに定義できます。この対応を定義したJava EEコンポーネントでは、参照名を指定してlookupメソッドを実行することで、その参照名に対応するJNDI名のオブジェクトをlookupできます。deployment descriptorファイルに定義する各参照名と、ネーミングサービスに登録された実際のJNDI名の対応について以下に説明します。

EJB参照名

以下の優先順位で参照名に対応するJNDI名を決定します。

  1. EJB参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

  2. EJB参照名に対して定義したdeployment descriptorファイルのmapped-name

  3. EJB参照名に対して定義したdeployment descriptorファイルのejb-link

  4. EJB参照名に対して定義したdeployment descriptorファイルのインタフェース名


以下に各定義方法を説明します。

EJB参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

Interstage deployment descriptorファイルに参照名とJNDI名を定義した場合、定義したJNDI名に対応付けます。

    <ejb-ref>
      <ejb-ref-name>ejb/MyEjb</ejb-ref-name>
      <jndi-name>CartBean</jndi-name>
    </ejb-ref>

他プロセスまたはリモートサーバのネーミングサービスに登録されたEnterprise JavaBeanにアクセスする場合には、Interoperable Naming Service(以降、INS)の規則を使用して、他プロセスまたはリモートサーバのホスト名、IIOPリスナーのポート番号、JNDI名を指定する必要があります。ホスト名とポート番号は1つのみ指定できます。ロードバランスやフェイルオーバーは行われないため、他プロセスまたはリモートサーバのネーミングサービスに登録されたEnterprise JavaBeanにアクセスする場合にはJ2EE実行環境を使用することをお勧めします。INSの詳細は、COS Naming規約を参照してください。以下のフォーマットで名前を指定します。


corbaname:iiop:ホスト名:ポート番号#JNDI名


ポート番号は以下の定義項目から確認できます。Interstage Java EE管理コンソールでも確認できます。

  • ${clusterName_instanceName_configName}.iiop-service.iiop-listener.${iiop-listener-id}.port

初期設定ではこの設定はシステムプロパティのIIOP_LISTENER_PORTを参照しているため、以下にポート番号が設定されています。

  • ${instanceName}.system-property.IIOP_LISTENER_PORT

以下はホスト名がmyHost、ポート番号が23700、JNDI名がCartBeanの例です。
corbaname:iiop:myHost:23700#CartBean


Interstage deployment descriptorファイルに以下のように定義します。

    <ejb-ref>
      <ejb-ref-name>ejb/MyEjb</ejb-ref-name>
      <jndi-name>corbaname:iiop:myHost:23700#CartBean</jndi-name>
    </ejb-ref>
EJB参照名に対して定義したdeployment descriptorファイルのmapped-name

deployment descriptorファイルのEJB参照(ejb-refタグ)にmapped-nameタグを指定すると指定したJNDI名に対応付けます。
EJB 3.0以降のEnterprise JavaBeansの場合、利用できます。

    <ejb-ref>
      <ejb-ref-name>ejb/MyEjb</ejb-ref-name>
      <remote>com.ejb1.CartRemote</remote>
      <mapped-name>CartBean</mapped-name>
</ejb-ref>

他プロセスまたはリモートサーバのネーミングサービスに登録されたEnterprise JavaBeanにアクセスする場合には、1.と同様にInteroperable Naming Service(以降、INS)の規則を使用してJNDI名を指定する必要があります。

EJB参照名に対して定義したdeployment descriptorファイルのejb-link

Java EEコンポーネントから別のEnterprise JavaBeanを呼び出す場合、deployment descriptorファイルのEJB参照(ejb-refタグ)を定義する際にejb-linkを定義することで、参照名とJNDI名が異なっていても対応付けが不要となります。同一のejb-jarファイルに含まれるEnterprise JavaBeanを呼び出す場合、以下のようにejb-linkに呼び出すEnterprise JavaBeanのejb-nameを指定します。

    <ejb-ref>
      <ejb-ref-name>ejb/MyEjb</ejb-ref-name>
      <remote>com.ejb1.CartRemote</remote>
      <ejb-link>CartBean</ejb-link>
    </ejb-ref>

また、同一ear内の異なるejb-jarに含まれるEnterprise JavaBeanを呼び出す場合には、以下のように定義します。呼び出す側のejb-jarファイルに対する呼び出される側のejb-jarファイルの相対パス(以下の例では"ejb1.jar")を定義し、続けて#を付けて呼び出すEnterprise JavaBeanのejb-name(以下の例では"CartBean")を定義します。

    <ejb-ref>
      <ejb-ref-name>ejb/MyEjb</ejb-ref-name>
      <remote>com.acme.FooRemote</remote>
      <ejb-link>ejb1.jar#CartBean</ejb-link>
    </ejb-ref>
EJB参照名に対して定義したdeployment descriptorファイルのインタフェース名

deployment descriptorファイルの<ejb-ref><home>タグに指定するインタフェース名、<ejb-ref><remote>タグに指定するインタフェース名により、以下のようにJNDI名として扱います。

<ejb-ref><home>タグに指定するインタフェース名

<ejb-ref><remote>タグに指定するインタフェース名

JNDI名

なし

あり

Remoteインタフェース名 (注)

あり

あり

Homeインタフェース名

あり

なし

Homeインタフェース名

なし

なし

1.または2.の定義が必須

注) 参照するejb-jarがEJB3.0以降の場合です。EJB3.0以降では、Homeインタフェースを定義しないことが可能であるため本条件となります。

EJBローカル参照名

EJBローカルインタフェースはネーミングサービスに登録されないため、JNDI名はありません。このため、以下の優先順位で参照するオブジェクトを決定します。また、EJBローカル参照は同一Java VMプロセス上のEJBアプリケーションを参照する場合だけ使用できます。

  1. EJBローカル参照名に対して定義したdeployment descriptorファイルのejb-link

  2. EJBローカル参照名に対して定義したdeployment descriptorファイルのインタフェース名


以下に各定義方法を説明します。

EJBローカル参照名に対して定義したdeployment descriptorファイルのejb-link

Java EEコンポーネントから別のEnterprise JavaBeanを呼び出す場合、EJBローカル参照(ejb-local-refタグ)を定義する際にdeployment descriptorファイルのejb-linkを定義することで、呼び出すEnterprise JavaBeanを指定できます。同一のejb-jarファイルに含まれるEnterprise JavaBeanを呼び出す場合、以下のようにejb-linkに呼び出すEnterprise JavaBeanのejb-nameを指定します。

<ejb-local-ref>
    <ejb-ref-name>ejb/CartEJB</ejb-ref-name>
    <local>com.mycompany.CartLocal</local>
    <ejb-link>CartBean</ejb-link>
</ejb-local-ref>

また、異なるejb-jarに含まれるEnterprise JavaBeanを呼び出す場合には、以下のように呼び出す側のejb-jarファイルから呼び出される側のejb-jarファイルの相対パスに、呼び出すEnterprise JavaBeanのejb-nameに#を付けて定義します。

<ejb-local-ref>
    <ejb-ref-name>ejb/CartEJB</ejb-ref-name>
    <local>com.mycompany.CartLocal</local>
    <ejb-link>CartEjb.jar#CartBean</ejb-link>
</ejb-local-ref>
EJBローカル参照名に対して定義したdeployment descriptorファイルのインタフェース名

deployment descriptorファイルの<ejb-local-ref><local-home>タグに指定するLocalHomeインタフェース名、<ejb-local-ref><local>タグに指定するLocalインタフェース名により、以下のように参照するオブジェクトを決定します。参照するEnterprise JavaBeansは、同一ejb-jarファイルに含まれている必要があります。異なるejb-jarに含まれるEnterprise JavaBeansを呼び出す場合には、必ず1.の定義方法を使用してください。

LocalHomeインタフェース

Localインタフェース

参照するオブジェクト

なし

あり

指定したLocalインタフェースを持つEnterprise JavaBeans (注)

あり

あり

指定したLocalHomeインタフェースを持つEnterprise JavaBeans

あり

なし

指定したLocalHomeインタフェースを持つEnterprise JavaBeans

なし

なし

1.の定義が必須

注) 参照するejb-jarがEJB3.0以降の場合です。EJB3.0以降では、LocalHomeインタフェースを定義しないことが可能であるため本条件となります。

永続性ユニット参照名

deployment descriptorファイルに定義したpersistence-unit-nameタグに指定したJNDI名のオブジェクトをlookupします。persistence-unit-nameタグを省略した場合、デフォルト永続性ユニットをlookupしてエンティティマネージャファクトリを返却します。

    <persistence-unit-ref>
      <description>
        Persistence unit for the inventory management application.
      </description>
      <persistence-unit-ref-name>
        persistence/InventoryAppDB
      </persistence-unit-ref-name>
      <persistence-unit-name>
InventoryManagement
</persistence-unit-name>
</persistence-unit-ref>

永続性コンテキスト参照名

deployment descriptorファイルに定義したpersistence-unit-nameタグに指定したJNDI名のオブジェクトをlookupします。persistence-unit-nameタグを省略した場合、デフォルト永続性ユニットをlookupしてエンティティマネージャを返却します。

    <persistence-context-ref>
      <description>
        Persistence context for the inventory management application.
      </description>
      <persistence-context-ref-name>
        persistence/InventoryAppMgr
      </persistence-context-ref-name>
      <persistence-unit-name>
InventoryManagement
</persistence-unit-name>
</persistence-context-ref>

リソース参照名

以下の優先順位でJNDI名を決定します。以下を定義しなかった場合には、エラーとなります。

  1. リソース参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

  2. リソース参照名に対して定義したdeployment descriptorファイルのmapped-nameの値


以下に各定義方法を説明します。

リソース参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

Interstage deployment descriptorにリソース参照名とJNDI名を定義した場合、定義したJNDI名に対応付けます。参照名(jdbc/symfo)を、JNDI名(myDS)に対応付ける場合には、Interstage deployment descriptorファイルに、以下のように参照名とJNDI名を定義します。

    <resource-ref>
      <res-ref-name>jdbc/symfo</res-ref-name>
      <jndi-name>myDS</jndi-name>
    </resource-ref>
リソース参照名に対して定義したdeployment descriptorファイルのmapped-nameの値

deployment descriptorファイルのリソース参照(resource-refタグ)にmapped-nameタグを指定すると、指定したJNDI名のオブジェクトをlookupメソッドで取得できます。
Java EE 5以降のアプリケーションの場合、利用できます。

    <resource-ref>
      <res-ref-name>jdbc/symfo</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
      <mapped-name>myDS</mapped-name>
    </resource-ref>

注意

resource-refタグのres-typeタグの指定が「java.net.URL」の場合、Interstage deployment descriptorファイルの参照名に対応付けるjndi-nameタグの値、またはdeployment descriptorファイルのmapped-nameタグには使用するURLを定義します。この定義したURLを元に生成されたjava.net.URLオブジェクトを、lookupメソッドで取得できます。以下のようにURLを指定します。

    <resource-ref>
      <res-ref-name>url/MyURL</res-ref-name>
      <jndi-name>http://www.fujitsu.com/</jndi-name>
    </resource-ref>

Destination参照名

以下の優先順位でJNDI名を決定します。

  1. Destinationリンクのリンク先に対して定義したInterstage deployment descriptorファイルのJNDI名

  2. Destinationリンクのリンク先に対して定義したdeployment descriptorファイルのmapped-nameの値

  3. Destination参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

  4. Destination参照名に対して定義したdeployment descriptorファイルのmapped-nameの値


以下に各定義方法を説明します。

Destinationリンクのリンク先に対して定義したInterstage deployment descriptorファイルのJNDI名

Destination参照名を定義するmessage-destination-refタグには、以下のようにmessage-destination-linkタグを定義できます。このタグに指定する値を、Destinationリンクと呼びます。
J2EE 1.4以降のアプリケーションの場合、利用できます。

    <message-destination-ref>
      <message-destination-ref-name>jms/myQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type> <message-destination-usage>Produces</message-destination-usage> <message-destination-link>myDestination</message-destination-link>
</message-destination-ref> ... <message-destination> <message-destination-name>myDestination</message-destination-name> </message-destination>

このDestinationリンクを定義した場合、リンク先のmessage-destination-nameに対してInterstage deployment descriptorファイルで定義したJNDI名のDestinationをlookupメソッドで取得できます。

    <message-destination>
      <message-destination-name>myDestination</message-destination-name>
      <jndi-name>myQueue</jndi-name>
    </message-destination>
Destinationリンクのリンク先に対して定義したdeployment descriptorファイルのmapped-nameの値

deployment descriptorファイルのDestinationリンクを定義した場合、リンク先のmessage-destination-nameにmapped-nameタグを指定すると、指定したJNDI名のDestinationをlookupメソッドで取得できます。
Java EE 5以降のアプリケーションの場合、利用できます。

    <message-destination-ref>
      <message-destination-ref-name>jms/myQueue</message-destination-ref-name>
<message-destination-type>javax.jms.Queue</message-destination-type> <message-destination-usage>Produces</message-destination-usage> <message-destination-link>myDestination</message-destination-link>
</message-destination-ref> ... <message-destination> <message-destination-name>myDestination</message-destination-name> <mapped-name>myQueue</mapped-name>
</message-destination>
Destination参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

Destinationリンクを定義しなかった場合、Destination参照名に対して定義したInterstage deployment descriptorファイルのJNDI名のDestinationをlookupメソッドで取得できます。

    <message-destination-ref>
      <message-destination-ref-name>jms/myQueue</message-destination-ref-name>
      <jndi-name>myQueue</jndi-name>
    </message-destination-ref>
Destination参照名に対して定義したdeployment descriptorファイルのmapped-nameの値

deployment descriptorファイルのDestinationリンクを定義しなかった場合、Destination参照(message-destination-refタグ)のmapped-nameタグを指定すると、指定したJNDI名のDestinationをlookupメソッドで取得できます。
Java EE 5以降のアプリケーションの場合、利用できます。

    <message-destination-ref>
      <message-destination-ref-name>jms/myQueue</message-destination-ref-name>
      <message-destination-type>javax.jms.Queue</message-destination-type>
      <message-destination-usage>Produces</message-destination-usage>
      <mapped-name>myQueue</mapped-name>
</message-destination-ref>

リソース環境参照名

以下の優先順位でJNDI名を決定します。

  1. リソース環境参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

  2. リソース環境参照名に対して定義したdeployment descriptorファイルのmapped-nameの値


以下に各定義方法を説明します。

リソース環境参照名に対して定義したInterstage deployment descriptorファイルのJNDI名

Interstage deployment descriptorファイルにリソース環境参照名とJNDI名を定義した場合、定義したJNDI名に対応付けます。参照名(eis/myAO)を、JNDI名(myAO)に対応付ける場合には、Interstage deployment descriptorファイルに以下のように参照名とJNDI名を定義します。

    <resource-env-ref>
      <resource-env-ref-name>eis/myAO</resource-env-ref-name>
      <jndi-name>myAO</jndi-name>
    </resource-env-ref>
リソース環境参照名に対して定義したdeployment descriptorファイルのmapped-nameの値

deployment descriptorファイルのリソース環境参照(resource-env-refタグ)にmapped-nameタグを指定すると、指定したJNDI名のオブジェクトをlookupメソッドで取得できます。
Java EE 5以降のアプリケーションの場合、利用できます。

    <resource-env-ref>
      <resource-env-ref-name>eis/myAO</resource-env-ref-name>
      <resource-env-ref-type>com.resource.AOType</resource-env-ref-type>
      <mapped-name>myAO</mapped-name>
</resource-env-ref>