IJServerクラスタを起動した際に、IJServerクラスタに定義されたリソースまたは配備されたEnterprise JavaBeanがネーミングサービスに登録されます。例えばJDBCリソースとして「jdbc/Symfo」というJNDI名でリソースを定義した場合、ネーミングサービスに「jdbc/Symfo」という名前でオブジェクトが登録されます。アプリケーションは、「jdbc/Symfo」という名前を指定してJNDIのlookupメソッドを実行すると登録されたオブジェクトを取得できます。このため、IJServerクラスタに定義するJNDI名は一意である必要があります。
ネーミングサービスに登録されるオブジェクト
ネーミングサービスに登録されるオブジェクトは以下です。
参照オブジェクト | JNDIのlookupメソッドに指定する名前 |
---|---|
リモート呼出し用Enterprise JavaBean | |
JDBCリソース | JDBCリソース定義時に指定したJNDI名 |
JMS接続ファクトリ | JMS接続ファクトリ定義時に指定したJNDI名 |
JMS送信先リソース | JMS送信先リソース定義時に指定したJNDI名 |
コネクタリソース | コネクタリソース定義時に指定したJNDI名 |
管理オブジェクトリソース | 管理オブジェクトリソース定義時に指定したJNDI名 |
カスタムリソース | カスタムリソース定義時に指定したJNDI名 |
外部リソース | 外部リソース定義時に指定したJNDI名 |
並行処理リソース | 並行処理リソース定義時に指定したJNDI名 |
注意
ローカル呼出し用のEnterprise JavaBeanやWebサービス参照は、IJServerクラスタのネーミングサービスでは管理されません。これらオブジェクトを利用する場合には、環境ネーミングコンテキストまたはDIを使用してください。
JavaMailセッションは、ネーミングサービスから参照しないでください。javax.mail.Sessionオブジェクトが返却されません。JavaMailセッションを使用する場合には、環境ネーミングコンテキストを使用してください。
リモート呼出し用Enterprise JavaBeanのJNDI名
リモート呼出し用Enterprise JavaBeanのJNDI名は、以下の優先順位で決定します。
リモート呼出し用のEnterprise JavaBeanには、Home/Remoteインタフェースまたはリモートビジネスインタフェースが定義されます。クライアントからEnterprise JavaBeanを呼び出す場合には、以下で決定したJNDI名でオブジェクトを取得し、そのオブジェクトに対してインタフェースのメソッドを呼び出します。
上記で決定したJNDI名を元にネーミングサービスには、以下の名前のオブジェクトが登録されます。
名前 | 説明 |
---|---|
JNDI名 | ビジネスインタフェース用のオブジェクトが登録されます。EJB 2.x以前の場合は、Homeインタフェース用のオブジェクトが登録されます。通常は、この名前を使用します。 |
JNDI名#ビジネスインタフェース名 | 各ビジネスインタフェースのJNDI名です。 |
JNDI名__3_x_Internal_RemoteBusinessHome__ | 内部制御用のため、アプリケーションからは使用しないでください。 |
以下にそれぞれの指定方法について説明します。
対象となるEnterprise JavaBeanにおいてInterstage deployment descriptor(glassfish-ejb-jar.xml)ファイルのjndi-nameタグにJNDI名を指定します。記述例を以下に示します。
<ejb> <ejb-name>CartBean</ejb-name> <jndi-name>Cart</jndi-name> </ejb>
deployment descriptor(ejb-jar.xml)ファイルのmapped-nameタグにJNDI名を指定します。記述例を以下に示します。
<enterprise-beans> <session> <ejb-name>CartBean</ejb-name> <mapped-name>Cart</mapped-name> ... </session> </enterprise-beans>
対象となるEnterprise JavaBeanにおいて@Stateless/@Stateful/@SingletonアノテーションのmappedName属性にJNDI名を指定します。記述例を以下に示します。
@Stateless(mappedName="Cart") public class CartBean implements CartObject { ... }
上記のいずれも設定しなかった場合、対象となるEnterprise JavaBeansのインタフェースの定義によって、以下の論理でデフォルトJNDI名を決定します。
Home/Remoteインタフェースの定義 | リモートビジネスインタフェースの総数 | デフォルトJNDI名 | 例 |
---|---|---|---|
なし | 0 | なし | なし |
なし | 1 | リモートビジネスインタフェースの完全修飾クラス名 | com.mycompany.CartBusiness |
なし | 2以上 | なし (注1) | なし |
あり | 0 | Homeインタフェースの完全修飾クラス名 | com.mycompany.CartHome |
あり | 1以上 | なし (注2) | なし |
JNDI名を定義する必要があります。また、クライアントから実際にオブジェクトを取得する場合には、使用するインタフェースごとに使用するJNDI名が異なります。詳細は、「リモートビジネスインタフェースが複数存在した場合のJNDI名」を参照してください。
注) JNDI名を定義しないとJNDI名が空文字(長さ0の文字列)と認識されます。このため、「#インタフェース名」や「__3_x_Internal_RemoteBusinessHome__」というオブジェクトが登録され、他のJNDI名と重複する可能性があります。必ずJNDI名を定義してください。
JNDI名を定義する必要があります。クライアントから実際にオブジェクトを取得する場合、定義したJNDI名を指定するとHomeインタフェース用のオブジェクトが取得されます。リモートビジネスインタフェースを使用する場合には、インタフェースごとに使用するJNDI名が異なります。詳細は、「リモートビジネスインタフェースが複数存在した場合のJNDI名」を参照してください。
注) JNDI名を定義しないとアプリケーションの起動時にエラーが発生し、アプリケーションが呼び出せない状態となります。必ずJNDI名を定義してください。
リモートビジネスインタフェースが複数存在した場合のJNDI名
Enterprise JavaBeanのリモートビジネスインタフェースが複数存在した場合、使用するインタフェースごとに使用するJNDI名が異なります。Enterprise JavaBeanに指定したJNDI名の後ろに#を付けて使用するインタフェース名を指定してください。例えば、リモートビジネスインタフェースとしてcom.ejb.CartBusiness1とcom.ejb.CartBusiness2が定義されたEnterprise JavaBeanに、JNDI名としてCartを指定したとします。この場合には、以下のようにJNDI名を指定してください。
InitialContext ic = new InitialContext(); CartBusiness1 bean1 = (CartBusiness1) ic.lookup("Cart#com.ejb.CartBusiness1"); CartBusiness2 bean2 = (CartBusiness2) ic.lookup("Cart#com.ejb.CartBusiness2");
クライアントからリモートサーバのネーミングサービスへの接続
クライアントからリモートサーバのネーミングサービスにIIOP通信でアクセスし、ネーミングサービスが管理するオブジェクトを参照できます。ネーミングサービスにリモート接続する場合には、IIOP通信の環境設定やチューニングパラメタの設定を行ってください。また、クライアントには接続先のホスト名とIIOPのポート番号を設定する必要があります。接続先の設定方法については、「4.12 JNDIの環境設定」を参照してください。
JNDI APIからネーミングサービスの更新
JNDI APIのbindメソッドやunbindメソッドなどを実行してアプリケーションからネーミングサービスの情報を更新(任意のオブジェクトの登録/削除)することもできます。しかし、以下に注意してください。
オブジェクトを登録した場合、登録したプロセスのネーミングサービスでだけ有効です。IJServerクラスタ内の他のプロセスのネーミングサービスには登録されません。
オブジェクトを登録したプロセスが一度停止した場合、登録したオブジェクトは削除されます。プロセスを再起動した際にオブジェクトの再登録が必要となります。
コンテナが登録したオブジェクトの削除や名前の変更は、誤動作する危険性があるため行わないでください。
JNDIブラウズ
ネーミングサービスに登録されたオブジェクトのJNDI名一覧は、asadminコマンドのlist-jndi-entriesサブコマンドで参照できます。