以下の事項についてはJ2EEに準拠したセションBeanと同じです。
注意
ローカルビジネスインタフェースを利用する場合は、以下の情報が参照渡しで転送されます。この場合の注意事項は27.2.6 値渡しと参照渡しの違いを参照してください。
クライアントからセションBeanへ送信するデータBeanやHashMap
セションBeanからクライアントへ返却されるデータBeanやHashMap
セション情報(セション同期機能を使用した場合)
ここでは、Java EEに固有の事項について説明します。
Apcoordinator以外のアプリケーションからApcoordinatorで作成したセションBeanを呼び出す場合のプログラミングを説明します。
Apcoordinatorアプリケーションから呼び出す方法は27.3 EJBの呼び出しを参照してください。
セションBeanクラスは次のように作成して、アプリケーション例外にApcoordinatorの例外クラスが含まれないようにします。
セションBeanクラスのsimpleExecメソッドをオーバライドし、スーパークラス(UjiSimpleStatelessBeanまたはUjiSimpleStatefulBean)のsimpleExecメソッドを呼び出します。
スーパークラスのsimpleExecメソッドがExceptionを発生させた場合は、それを受け取り、Apcoordinatorの例外クラスを使わない例外オブジェクトを新たに作成して発生させます。
以下はセションBeanクラスの記述例です。
package ejboffice.ejb;
import javax.ejb.Stateful;
import com.fujitsu.uji.ejb.bean.UjiSimpleStatefulBean;
@Stateful
public class OfficeBean extends UjiSimpleStatefulBean implements Office {
...
public Object[] simpleExec(Object dataBean, String verb, Object syncData) throws Exception {
try {
return super.simpleExec(dataBean, verb, syncData);
} catch (RuntimeException e) {
// システム例外の場合はそのままthrowします。
throw e;
} catch (Exception e) {
// アプリケーション例外の場合はApcoordinatorの例外クラスが含まれないように
// 新たに作成します。
throw new Exception(e.getMessage());
}
}
}
注意
ビジネスクラスがアプリケーション例外を発生させた場合、クライアントにはsimpleExecメソッドで作成した例外(上記の例ではExceptionクラス)が通知されます。ビジネスクラスで発生した例外ではありません。
Apcoordinator以外のアプリケーションからセションBeanを呼び出した場合、ログにはコンテキストIDが出力されません。コンテキストIDについては5.4 コンテキストIDの出力を参照してください。
EJBクライアントのプログラムではセションBeanを以下の手順で呼び出します。
JNDIを使ってビジネスインタフェースを取得します。
ビジネスインタフェースのsimpleExecメソッドを呼び出します。引数には以下のオブジェクトを指定します。
第1引数: データBeanまたはHashMapを指定します。このオブジェクトが、セションBeanのビジネスクラスの第2引数に与えられます。
第2引数: コマンドを指定します。
第3引数: セションクラスに転送するオブジェクトを指定します。セションBeanがセション同期機能を使用している場合に指定してください。指定されたデータは、セションBeanにおいてsetSynchronizedDataメソッドによりセションクラスにセットされます。セション同期機能が使用されていない場合はnullを指定します。
Apcoordinator以外のアプリケーションから呼び出す場合は、データBean変換機能は使用できません。入力データをHashMapで受け取るセションBeanに対しては、simpleExecメソッドの第1引数にHashMapを指定してください。
simpleExecメソッドの返却値はObject[]です。配列には以下のオブジェクトが格納されています。
要素[0]: ビジネスクラスの返却値です。
要素[1]: セションクラスから自動転送されたオブジェクトです。このオブジェクトは、セションBeanがセション同期機能を使用している場合に、セションクラスのgetSynchronizedDataメソッドにより取得されたものです。セション同期機能が使用されていない場合は、simpleExecメソッドの第3引数に与えたデータがそのまま返却されます。
ステートフルセションBeanの場合は、ビジネスインタフェースのremoveメソッドを呼び出してセションBeanオブジェクトを削除します。
以下はセションBeanを呼び出す例です。この例では、ビジネスインタフェースはOfficeです。
import javax.naming.InitialContext; ... HashMap syncData = new HashMap(); // セションBeanのセションクラスとの間で転送されるオブジェクト syncData.put("userId","abc1234"); ... // ビジネスインタフェース取得 InitialContext ctx = new InitialContext(); Office bi = (Office)ctx.lookup("java:comp/env/ejb/OfficeBean"); // セションBean呼び出し MessageBean bean = new MessageBean(); bean.setMessage("Hello!"); Object[] replyArray = bi.simpleExec(bean, "sayHello", syncData); // 返却値の取得 MessageBean reply=(MessageBean)replyArray[0]; syncData=(HashMap)replyArray[1];
EJBクライアントには、実行時ライブラリとしてujiejbcl.jarが必要です。このファイルをEJBクライアントの実行環境にコピーし、クラスパスに追加してください。ujiejbcl.jarのインストール先は13.1 アプリケーションに必要なApcoordinatorのファイルを参照してください。
ujiejbcl.jarは以下のクラスとインタフェースを提供します。
Apcoordinatorで作成したセションBeanのビジネスインタフェース
データBean (com.fujitsu.uji.DataBeanクラス)
ujiejbcl.jarは再配布可能なファイルです。クライアント環境に配布して使用できます。
J2EEに準拠したアプリケーションからEJB 3.0に準拠したセションBean(Apcoordinatorで作成したもの)を呼ぶことができます。この場合、セションBeanにホームインタフェースとリモートインタフェースを追加する必要があります。作成方法はJ2EEに準拠したセションBeanと場合と同じです。詳細はホームインタフェースとリモートインタフェースを参照してください。ホームインタフェースのインタフェース名を指定するには、セションBeanクラスに@RemoteHomeアノテーションを付けてホームインタフェース名を記述します。
また、セションBeanは以下の条件を満たす必要があります。
アプリケーション例外、システム例外として使う例外クラスは、EJB 2.1の仕様にしたがう必要があります。EJB 2.1のアプリケーション例外、システム例外については、24.2.1 例外処理を参照してください。
EJBの引数や返却値として使用するオブジェクトはRMI over IIOPの規約にしたがう必要があります。詳細は、24.3.6 EJBの引数や返却値として使用可能なオブジェクトを参照してください。
セションBeanの呼び出し方法は、J2EEに準拠したセションBeanと同じです。
注意
EJB 3.0に準拠したセションBeanは、Apcoordinatorによるローカル呼び出しを使って呼び出すことはできません。