Apcoordinator以外のアプリケーションからApcoordinatorで作成したセションBeanを呼び出す場合のプログラミングを説明します。
セションBeanクラスは次のように作成して、execメソッドが発生するInvocationTargetExceptionにApcoordinatorの例外クラスが含まれないようにします。
セションBeanクラスのexecメソッドをオーバライドし、スーパークラス(UjiSessionBeanクラス)のexecメソッドを呼び出します。
スーパークラスのexecメソッドがInvocationTargetExceptionを発生した場合は、それを受け取り、Apcoordinatorの例外クラスを内部にラップしないInvocationTargetExceptionを新たに作成して発生させます。
以下はセションBeanクラスの記述例です。
import com.fujitsu.uji.ejb.bean.UjiSessionBean; import java.lang.reflect.InvocationTargetException; public class OfficeEJB extends UjiSessionBean { public Object[] exec(Object dataBean, String verb, Object syncData) throws InvocationTargetException { try { return super.exec(dataBean,verb,syncData); } catch (InvocationTargetException e) { Throwable rootCause=e.getTargetException(); Exception replaced=new Exception(rootCause.getMessage()); throw new InvocationTargetException(replaced); } } }
このように作成したセションBeanをApcoordinatorアプリケーションから呼び出す場合、セションBean内で例外が発生した際にクライアントに通知されるのはexecメソッドで作成した例外(上記の例ではExceptionクラス)になります。セションBeanのビジネスクラスで発生した例外ではありません。
クライアントのプログラムではセションBeanを以下の手順で呼び出します。
JNDIを使ってホームインタフェースを取得します。
ホームインタフェースのcreateメソッドを呼び出し、リモートインタフェースを取得します。createメソッドの引数はありません。
リモートインタフェースのexecメソッドを呼び出します。引数には以下の3個のオブジェクトを渡します。
第1引数: データBeanまたはHashMapを指定します。このオブジェクトが、セションBeanのビジネスクラスの第2引数に与えられます。
第2引数: コマンドを指定します。
第3引数: セションクラスに転送するオブジェクトを指定します。セションBeanがセション同期機能を使用している場合に指定してください。指定されたデータは、セションBeanにおいてsetSynchronizedDataメソッドによりセションクラスにセットされます。セション同期機能が使用されていない場合はnullを指定します。
Apcoordinator以外のアプリケーションから呼び出す場合は、データBean変換機能は使用できません。入力データをHashMapで受け取るセションBeanに対しては、execメソッドの第1引数にHashMapを指定してください。
execメソッドの返却値をの型はObject[]です。配列の各要素には以下のオブジェクトが格納されています。
要素[0]: ビジネスクラスの返却値です。
要素[1]: セションクラスから自動転送されたオブジェクトです。このオブジェクトは、セションBeanがセション同期機能を使用している場合に、セションクラスのgetSynchronizedDataメソッドにより取得されたものです。セション同期機能が使用されていない場合は、execメソッドの第3引数に与えたデータがそのまま返却されます。
セションBeanの実行中にアプリケーション例外が発生した場合は、execメソッドがjava.lang.reflect.InvocationTargetExceptionを発生します。
以下はセションBeanを呼び出す例です。ホームインタフェースをSimpleBeanHome、リモートインタフェースをSimpleBeanRemoteとしています。
import javax.naming.InitialContext; import javax.rmi.PortableRemoteObject; ... HashMap syncData=new HashMap(); // セションBeanのセションクラスとの間で転送されるオブジェクト syncData.put("userId","abc1234"); ... // ホームインタフェース取得 InitialContext ctx=new InitialContext(); SimpleBeanHome home=(SimpleBeanHome)PortableRemoteObject.narrow( ctx.lookup("java:comp/env/ejb/SimpleBean"),SimpleBeanHome.class); // リモートインタフェース取得 SimpleBeanRemote remote=home.create(); // セションBean呼び出し MessageBean bean=new MessageBean(); bean.setMessage("Hello!"); Object[] replyArray=remote.exec(bean,"echo",syncData); // 返却値の取得 MessageBean reply=(MessageBean)replyArray[0]; syncData=(HashMap)replyArray[1];
上記の方法でセションBeanを呼び出すEJBクライアントには、実行時ライブラリとしてujiejbcl.jarが必要です。このファイルをEJBクライアントの実行環境にコピーし、クラスパスに追加してください。 ujiejbcl.jarは、Apcoordinatorをインストールすることにより、[Apcoordinatorのインストールフォルダ]\redist\ejb にインストールされます。
ujiejbcl.jarにより、以下を利用するのに必要なクラスが提供されます。
Apcoordinatorで作成したセションBeanのホームインタフェース、リモートインタフェース
データBean (com.fujitsu.uji.DataBeanクラス)
ujiejbcl.jarは再配布可能なファイルです。クライアント環境に配布して使用できます。