Apcoordinator ユーザーズガイド |
目次 |
第2部 Apcoordinatorコアの機能 | > 第7章 EJBの呼び出し | > 7.6 EJBの再試行 |
EJB再試行機能を使用してEJBを呼び出すには、リモート共通インタフェースを使用し、EJBを呼び出すアプリケーションを以下のように作成します。
リモートマップを作成して、呼び出すセションBeanの名前と再試行のパラメータを定義します。リモートマップは、リモート共通インタフェースにおいて、呼び出されるアプリケーションを定義するXMLファイルです。リモートマップの詳細はリモートマップを参照してください。ここでは、EJB再試行機能を使用する場合のリモートマップの記述方法を説明します。
以下は、EJB再試行機能を使う場合のリモートマップの記述例です。
<?xml version="1.0" encoding="iso-2022-jp"?> <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ミリ秒より高い精度による指定はシステムによっては有効にならない場合があります。
com.fujitsu.uji.ext.CallFactory
とcom.fujitsu.uji.ext.Call
の2つのインタフェースを使用してセションBeanを呼び出します。
これらのインタフェースは、リモート共通インタフェースにおいてアプリケーションを呼び出すためのインタフェースです。詳細はCallFactory
インタフェースとCall
インタフェースによる呼び出しを参照してください。
ここでは、これらのインタフェースの使用方法をEJB再試行機能の場合について説明します。
CallFactory
インタフェースとCall
インタフェースを使った呼び出しの手順は以下の通りです。
com.fujitsu.uji.DispatchContext
クラスからCallFactory
インタフェースを取得します。
ejbExt
タグのname
アトリビュートに指定したもの)を指定してCallFactory
インタフェースからCall
インタフェースを取得します。この処理によって、セション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複数指定機能を併用するには、リモートマップにejbExt
タグを以下のように記述します。
EJB複数指定機能を使用して呼び出すセションBeanのグループを
<?xml version="1.0" encoding="iso-2022-jp"?> <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>
ejbExt
タグで定義します。さらに、ejbExt
タグのコンテントにretriableException
タグを記述して再試行例外を定義します。必要に応じて、ejbExt
タグにretryCount
アトリビュート(再試行最大回数)やretryInterval
アトリビュート(再試行間隔)を追加します。
EJB再試行機能とEJB複数指定機能を併用した場合、Call
インタフェースのinvoke
メソッド呼び出し時に、セションBeanオブジェクトの作成と呼び出しが以下の順に実行されます。
Call
インタフェース取得後で最初にinvoke
が呼び出された場合は、セションBeanオブジェクトを作成します。EJB複数指定機能はこのタイミングで動作します。EJBコンテナがダウンしていると判定した場合は、別のEJBコンテナを選択して、再度セションBeanオブジェクトの作成を実行します。セションBeanオブジェクトの作成に成功すると、2の処理に進みます。
UjiRemoteException
を発生します。
リモートマップでejbExt
タグのcreateOnInvoke
アトリビュートにtrue
を指定した場合は、Call
オブジェクトのinvoke
メソッドを呼び出すたびに新しくセションBeanオブジェクトが作成されます。この場合、上記の1の処理はinvoke
が呼び出された時に常に実行されます。
目次 |