Apcoordinator ユーザーズガイド
|
目次
![前ページ](../guidecom/previous.gif)
|
24.3.5 Apcoordinator以外のEJBクライアントとの連携
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は再配布可能なファイルです。クライアント環境に配布して使用できます。
All Rights Reserved, Copyright © 富士通株式会社 2000-2005