JNDI を使用するアプリケーションの多くはコンテナーで実行されます。 一部にはそうでないものもあります。 オブジェクトの検索に使用される名前は、アプリケーションがコンテナーで実行されるかどうかによって異なります。アプリケーションでは、ルックアップ名として corbaname URL を使用する方が便利な場合があります。コンテナー・ベースの JNDI クライアントおよび Java シン・クライアントは、corbaname URL を使用することができます。
以下の例は、さまざまなタイプのアプリケーションから JNDI ルックアップを実行する方法を示したものです。
コンテナーで実行されるアプリケーションは、java: ルックアップ名を使用できます。 この形式のルックアップ名は、 オブジェクトの検索に使用されるルックアップ名が、 ネーム・サーバーのネーム・スペースにバインドされているためにオブジェクトの名前には依存しないという間接レベルを提供します。 アプリケーションのデプロイメント記述子は、java: 名とネーム・サーバーのルックアップ名からのマッピングを提供します。 コンテナーは、java: 名が対応するオブジェクトに正しくマップされるよう、 デプロイメント記述子の情報に基づき java: ネーム・スペースをセットアップします。
以下の例は、EJB ホームのルックアップを示しています。 実際のホームのルックアップ名は、 アプリケーションのデプロイメント記述子によって決定されます。 Enterprise Bean (EJB) は、 EJB コンテナーにあります。 このコンテナーでは、Bean とその Bean が置かれているアプリケーション・サーバーとの間の インターフェースが提供されます。
// Get the initial context as shown in a previous example ... // Look up the home interface using the JNDI name try { java.lang.Object ejbHome = initialContext.lookup( "java:comp/env/com/mycompany/accounting/AccountEJB"); accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( (org.omg.CORBA.Object) ejbHome, AccountHome.class); } catch (NamingException e) { // Error getting the home interface ... }
コンテナーで実行されないアプリケーションは、java: ルックアップ名を使用することはできません。 これは、コンテナーがアプリケーションの java: ネーム・スペースをセットアップするためです。 その代わり、 このようなアプリケーションは、ネーム・サーバーから直接オブジェクトを検索する必要があります。各アプリケーション・サーバーは、ネーム・サーバーを含んでいます。EJB ホームなどのシステム成果物は、そのネーム・サーバーのサーバー・ルート・コンテキストにバインドされています。各種のネーム・サーバーが、 システムのネーム・スペース構造により統合されています。異なるサーバーのオブジェクトをルックアップするには、 セル内のいずれの初期コンテキストからも名前解決されるよう、名前を修飾する方法をお勧めします。 相対名が使用されている場合、初期コンテキストは、オブジェクトがバインドされているサーバー・ルート・コンテキストと同じサーバー・ルート・コンテキストである必要があります。修飾名の形式は、その修飾名がトポロジー・ベースの名前か 固定名かによって異なります。以下の例は、修飾名の各形式を示しています。
トポロジー・ベースの修飾名は、システム・ネーム・スペースで、ターゲット・オブジェクトがバインドされているサーバー・ルート・コンテキストを全探索します。 トポロジー・ベースの修飾名は、セル内のいずれの初期コンテキストからも解決されます。
// Get the initial context as shown in a previous example // Using the form of lookup name below, it doesn't matter which // server in the cell is used to obtain the initial context. ... // Look up the home interface using the JNDI name try { java.lang.Object ejbHome = initialContext.lookup( "cell/nodes/Node1/servers/MyServer/com/mycompany/accounting/AccountEJB"); accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( (org.omg.CORBA.Object) ejbHome, AccountHome.class); } catch (NamingException e) { // Error getting the home interface ... }
ターゲット・オブジェクトにセル・スコープの固定名が定義されている場合、トポロジー・ベースの修飾名の代わりに、その名前の修飾形式を使用することができます。トポロジー・ベースの名前が機能する場合でも、固定名は、特定のセル・トポロジー、またはターゲット・オブジェクトの他のサーバーへの移動に伴って変わることがありません。以下の例は、修飾された固定名を使用したルックアップを示しています。
// Get the initial context as shown in a previous example // Using the form of lookup name below, it doesn't matter which // server in the cell is used to obtain the initial context. ... // Look up the home interface using the JNDI name try { java.lang.Object ejbHome = initialContext.lookup( "cell/persistent/com/mycompany/accounting/AccountEJB"); accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( (org.omg.CORBA.Object) ejbHome, AccountHome.class); } catch (NamingException e) { // Error getting the home interface ... }
corbaname は、ルックアップ名として役立つ場合があります。例えば、ターゲット・オブジェクトが統合済みネーム・スペースのメンバーでなく、修飾名を使用して位置指定することができない場合、corbaname を使用すると、簡単にオブジェクトのルックアップを行うことができます。以下に、corbaname URL を使用したルックアップを示します。
// Get the initial context as shown in a previous example ... // Look up the home interface using a corbaname URL try { java.lang.Object ejbHome = initialContext.lookup( "corbaname:iiop:someHost:2809#com/mycompany/accounting/AccountEJB"); accountHome = (AccountHome)javax.rmi.PortableRemoteObject.narrow( (org.omg.CORBA.Object) ejbHome, AccountHome.class); } catch (NamingException e) { // Error getting the home interface ... }