EJB再試行機能を使用してEJBを呼び出すには、リモート共通インタフェースを使用し、EJBを呼び出すアプリケーションを以下のように作成します。
リモートマップの作成
リモートマップを作成して、呼び出すセションBeanの名前と再試行のパラメータを定義します。リモートマップは、リモート共通インタフェースにおいて、呼び出されるアプリケーションを定義するXMLファイルです。リモートマップの詳細は“7.2 リモートマップ”を参照してください。ここでは、EJB再試行機能を使用する場合のリモートマップの記述方法を説明します。
以下は、EJB再試行機能を使う場合のリモートマップの記述例です。
<?xml version="1.0" encoding="Shift_JIS"?> <remoteMap xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap http://interstage.fujitsu.com/schemas/uji/remotemap.xsd"> <config> <version>5.0</version> </config> <!-- EJB再試行機能を使って呼び出すセションBeanを定義します。--> <ejbExt name="MySessionBean" retryCount="3" retryInterval="150" > <application name="java:comp/env/ejb/MySessionBean" /> <retriableException class="some.pkg.BusyException" /> <retriableException class="some.pkg.NotReadyException" /> </ejbExt> </remoteMap>
呼び出すセションBeanをejbExtタグを使って記述します。セションBeanに与える名前をejbExtタグのnameアトリビュートに指定します。ejbExtタグのコンテントにはapplicationタグを書き、applicationタグのnameアトリビュートにはJNDIで検索するセションBeanの名前を指定します。
さらに、ejbExtタグのアトリビュートとコンテントには、再試行に関する以下のパラメータを指定します。
再試行最大回数
ejbExtタグのretryCountアトリビュートに指定します。例えば2を指定すると、初回の呼び出しを含めて最大で合計3回呼び出されます。デフォルトは2です。
再試行間隔
再試行するまでの時間をミリ秒単位で指定します。ejbExtタグのretryIntervalアトリビュートに指定します。デフォルトは100ミリ秒です。
再試行例外
再試行例外として使用するアプリケーション例外のクラスをretriableExceptionタグで指定します。retriableExceptionタグはejbExtタグのコンテントに記述します。retriableExceptionタグのclassアトリビュートに例外クラスを指定します。セションBeanを呼び出した結果、アプリケーション例外が発生し、その例外のクラスがclassアトリビュートに指定したクラスと同じか、そのサブクラスであった場合に、再試行します。なお、以下のクラスを再試行例外に指定することはできません。
java.lang.RuntimeExceptionとそのサブクラス
java.rmi.RemoteExceptionとそのサブクラス
java.lang.Exception
java.lang.Errorとそのサブクラス
注意
再試行間隔の精度はご使用になるシステムに依存します。 10ミリ秒より高い精度による指定はシステムによっては有効にならない場合があります。
CallFactoryインタフェースとCallインタフェースによるセションBeanの呼び出し
com.fujitsu.uji.ext.CallFactoryとcom.fujitsu.uji.ext.Callの2つのインタフェースを使用してセションBeanを呼び出します。これらのインタフェースは、リモート共通インタフェースにおいてアプリケーションを呼び出すためのインタフェースです。詳細は“7.3 CallFactoryインタフェースとCallインタフェースによる呼び出し”を参照してください。ここでは、これらのインタフェースの使用方法をEJB再試行機能の場合について説明します。
CallFactoryインタフェースとCallインタフェースを使った呼び出しの手順は以下のとおりです。
com.fujitsu.uji.DispatchContextクラスからCallFactoryインタフェースを取得します。
セションBeanの名前(ejbExtタグのnameアトリビュートに指定したもの)を指定してCallFactoryインタフェースからCallインタフェースを取得します。この処理によって、セションBeanオブジェクトが作成されます。
データBeanとコマンド名を引数としてCallインタフェースのinvokeメソッドを呼び出すと、セションBeanが呼び出されます。セションBeanが再試行例外を発生した場合は、セションBeanが再度呼び出されます。
以下はビジネスクラスからセションBeanを呼び出す例です。
import com.fujitsu.uji.DispatchContext; import com.fujitsu.uji.ext.CallFactory; import com.fujitsu.uji.ext.Call; import com.fujitsu.uji.ext.UjiCreateException; import com.fujitsu.uji.ext.UjiRemoteException; import com.fujitsu.uji.ext.UjiTargetException; ... public Object doSomething(DispatchContext context, SomeBean dataBean) { // CallFactoryインタフェースを取得します。 CallFactory factory = context.getCallFactory(); try { // セションBeanの名前を指定してCallインタフェースを取得します。 Call call = factory.createCall("MySessionBean"); // 送信するデータとコマンド名を指定してセションBeanを呼び出します。 ResBean response = (ResBean)call.invoke(dataBean,"update"); } catch (UjiCreateException e) { ... } catch (UjiRemoteException e) { ... } catch (UjiTargetException e) { ... } ... }
再試行最大回数だけ再試行を繰り返してもセションBeanが例外を発生する場合、invokeメソッドはcom.fujitsu.uji.ejb.EJBApplicationExceptionを発生します。セションBeanで発生した例外は、EJBApplicationExceptionのgetRootCauseメソッドにより取得できます。
セションBeanがシステム例外を発生した場合は、invokeメソッドがcom.fujitsu.uji.ext.UjiRemoteExceptionを発生します。再試行は行われません。
EJB複数指定機能との併用
EJB再試行機能はEJB複数指定機能と併用できます。
EJB再試行機能とEJB複数指定機能を併用するには、リモートマップにejbExtタグを以下のように記述します。
<?xml version="1.0" encoding="Shift_JIS"?> <remoteMap xmlns=http://interstage.fujitsu.com/schemas/uji/remoteMap xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xsi:schemaLocation="http://interstage.fujitsu.com/schemas/uji/remoteMap http://interstage.fujitsu.com/schemas/uji/remotemap.xsd"> <config> <version>5.0</version> </config> <!-- EJB複数指定機能を使用して呼び出すセションBeanのグループを定義します。 --> <!-- また、再試行例外を定義します。 --> <ejbExt name="MySessionBeans" type="proxy" > <application name="java:comp/env/ejb/MySessionBean1" /> <application name="java:comp/env/ejb/MySessionBean2" /> <application name="java:comp/env/ejb/MySessionBean3" /> <retriableException class="some.pkg.BusyException" /> <retriableException class="some.pkg.NotReadyException" /> </ejbExt> </remoteMap>
EJB複数指定機能を使用して呼び出すセションBeanのグループをejbExtタグで定義します。さらに、ejbExtタグのコンテントにretriableExceptionタグを記述して再試行例外を定義します。必要に応じて、ejbExtタグにretryCountアトリビュート(再試行最大回数)やretryIntervalアトリビュート(再試行間隔)を追加します。
EJB再試行機能とEJB複数指定機能を併用した場合、Callインタフェースのinvokeメソッド呼び出し時に、セションBeanオブジェクトの作成と呼び出しが以下の順に実行されます。
Callインタフェース取得後で最初にinvokeが呼び出された場合は、セションBeanオブジェクトを作成します。EJB複数指定機能はこのタイミングで動作します。EJBコンテナがダウンしていると判定した場合は、別のEJBコンテナを選択して、再度セションBeanオブジェクトの作成を実行します。セションBeanオブジェクトの作成に成功すると、2の処理に進みます。
セションBeanオブジェクトを呼び出します。EJB再試行機能はこのタイミングで動作します。セションBeanが再試行例外を発生した場合は、同一のセションBeanを再度呼び出します。この段階でEJBコンテナがダウンしていた場合、セションBeanオブジェクトは再作成せず、例外UjiRemoteExceptionを発生します。
リモートマップでejbExtタグのcreateOnInvokeアトリビュートにtrueを指定した場合は、Callオブジェクトのinvokeメソッドを呼び出すたびに新しくセションBeanオブジェクトが作成されます。この場合、上記の1の処理はinvokeが呼び出された時に常に実行されます。