2.13.6 EJBのリモートインタフェースの呼び出しに関する注意事項
EJBのリモートインタフェースの呼び出しに関する注意事項について説明します。
- 〈この項の構成〉
(1) ローカル呼び出しの最適化適用時の注意事項
-
同一アプリケーション内での処理で,EJBのリモートインタフェースのローカル呼び出し最適化を適用する場合(usrconf.propertiesに「ejbserver.rmi.localinvocation.scope=app」を指定する場合),次のプロバイダURLには同じホストを指定してください。
-
J2EEサーバで使用するプロバイダURLのホスト
-
J2EEアプリケーションから使用するプロバイダURLホスト
ホストの指定が異なると,ローカル呼び出しの最適化が行われません。
また,同じホストを指定している場合でも,ホスト名に指定した文字列が異なると,ローカル呼び出しの最適化は行われません。例えば,大文字と小文字の違いや,IPアドレス指定とホスト名指定の違いなどがあると,ローカル呼び出しの最適化は行われません。
-
-
J2EEサーバが使用するプロバイダURLは次の優先順位で決定されます。
ejbserver.naming.startupMode=inprocessの場合
-
vbroker.se.iiop_tp.hostプロパティの値
-
InetAddress.getLocalHost().getHostName()の値
ejbserver.naming.startupMode=automaticの場合
-
InetAddress.getLocalHost().getHostName()の値
ejbserver.naming.startupMode=manualの場合
-
ejbserver.naming.hostプロパティの値
-
InetAddress.getLocalHost().getHostName()の値
-
-
J2EEアプリケーションから使用するプロバイダURLは次の優先順位で決定されます。
-
ネーミング切り替え機能使用時にlookupに渡す引数部分
-
InitialContext生成時に指定するjava.naming.provider.urlプロパティ
-
J2EEサーバが使用するプロバイダURL
-
(2) EJBのリモートインタフェースの通信障害発生時の動作設定時の注意事項
システムプロパティのejbserver.container.rebindpolicyキーで"NO_RECONNECT"(再接続なし/再送なし)を選択した場合,通信障害によってコネクションが切断されると,再接続が抑止されているため該当するオブジェクトリファレンスは再利用できなくなります。このため,EJBクライアントでは,次回Enterprise Beanのメソッド呼び出しをする場合には,EJBホームオブジェクトのときはlookupメソッド,EJBオブジェクトのときはcreateメソッドを再実行したあと,メソッド呼び出しを実行してください。なお,Enterprise Beanのメソッド呼び出し中にコネクションが切断された場合,メソッドは次のどちらかの例外を送出します。
- java.rmi.RemoteException
-
detailフィールドがorg.omg.CORBA.REBINDのインスタンス
- java.rmi.MarshalException
-
detailフィールドがorg.omg.CORBA.COMM_FAILUREのインスタンス
これらの例外をキャッチするクライアントのコーディング例を次に示します。
try { //JNDI.lookup() //EJBHome.create() //EJBObject.invoke() } catch (java.rmi.MarshalException e) { if (e.detail instanceof org.omg.CORBA.COMM_FAILURE) { //通信障害に対応する処理 } } catch (java.rmi.RemoteException e) { if (e.detail instanceof org.omg.CORBA.REBIND) { //通信障害に対応する処理 } }
(3) 複数スレッド実行時の注意事項
リモートインタフェースとして定義されたEJBメソッドを(一つのクライアントから)複数スレッドで呼び出す場合,サーバへのコネクションは一つだけで,複数スレッドでそのコネクションを共有します。一つのEJBの呼び出しでタイムアウトが発生してコネクションがクローズした場合,ほかのEJBの呼び出しは通信障害となります。クライアントの動作として「コネクションを再接続して,リクエストを再送信する」を選択している場合,再度EJBの呼び出しが実行されます。
タイムアウト発生時のコネクションクローズを抑止したい場合,EJBの呼び出し元(クライアント側)のusrconf.properties(J2EEサーバ用ユーザプロパティファイル,バッチサーバ用ユーザプロパティファイル,またはJavaアプリケーション用ユーザプロパティファイル)には,次の内容を設定してください。詳細については,マニュアル「TPBroker 運用ガイド」を参照してください。
- 内容
vbroker.ce.iiop.ccm.htc.readerPerConnection=true vbroker.ce.iiop.ccm.htc.threadStarter=true
上記の内容を設定した場合,起動するスレッドが追加されます。スレッド数の見積もりについては,マニュアル「アプリケーションサーバ システム設計ガイド」の「5.2.1 J2EEサーバが使用するリソースの見積もり」を参照してください。
(4) ネーミング管理機能でのキャッシング機能を有効にしている場合の注意事項
ネーミング管理機能でのキャッシング機能を有効にしている場合,コネクション切断後にlookupメソッドを実行すると,キャッシュ上の無効なオブジェクトリファレンスが取得されます。この場合,取得したオブジェクトリファレンスを使用してjavax.rmi.PortableRemoteObject.narrowメソッドやcreateメソッドを実行したときに,CORBA例外(org.omg.CORBA.OBJECT_NOT_EXISTなど)が発生することがあります。
コネクション切断後の無効なキャッシュはクリアしてください。手順については,マニュアル「アプリケーションサーバ 機能解説 基本・開発編(コンテナ共通機能)」の「2.8.2 ネーミングで使用したキャッシュのクリア」を参照してください。