ネーミングサービスはシステムで一意の名前でオブジェクトを一元管理する仕組みですが、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>タグ値 |
アノテーションに注入された情報が登録されます。例えば、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名を決定します。
以下に各定義方法を説明します。
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>
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名を指定する必要があります。
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>
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アプリケーションを参照する場合だけ使用できます。
以下に各定義方法を説明します。
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>
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名を決定します。以下を定義しなかった場合には、エラーとなります。
以下に各定義方法を説明します。
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ファイルのリソース参照(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名を決定します。
Destinationリンクのリンク先に対して定義したInterstage deployment descriptorファイルのJNDI名
Destinationリンクのリンク先に対して定義したdeployment descriptorファイルのmapped-nameの値
Destination参照名に対して定義したInterstage deployment descriptorファイルのJNDI名
Destination参照名に対して定義したdeployment descriptorファイルのmapped-nameの値
以下に各定義方法を説明します。
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>
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リンクを定義しなかった場合、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>
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名を決定します。
以下に各定義方法を説明します。
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ファイルのリソース環境参照(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>