ページの先頭行へ戻る
 Apcoordinatorユーザーズガイド

25.3.5 Apcoordinator以外のEJBクライアントとの連携

Apcoordinator以外のアプリケーションからApcoordinatorで作成したセションBeanを呼び出す場合のプログラミングを説明します。

セションBeanクラスは次のように作成して、execメソッドが発生するInvocationTargetExceptionにApcoordinatorの例外クラスが含まれないようにします。

以下はセション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を以下の手順で呼び出します。

  1. JNDIを使ってホームインタフェースを取得します。

  2. ホームインタフェースのcreateメソッドを呼び出し、リモートインタフェースを取得します。createメソッドの引数はありません。

  3. リモートインタフェースのexecメソッドを呼び出します。引数には以下の3個のオブジェクトを渡します。

    • 第1引数: データBeanまたはHashMapを指定します。このオブジェクトが、セションBeanのビジネスクラスの第2引数に与えられます。

    • 第2引数: コマンドを指定します。

    • 第3引数: セションクラスに転送するオブジェクトを指定します。セションBeanがセション同期機能を使用している場合に指定してください。指定されたデータは、セションBeanにおいてsetSynchronizedDataメソッドによりセションクラスにセットされます。セション同期機能が使用されていない場合はnullを指定します。

    Apcoordinator以外のアプリケーションから呼び出す場合は、データBean変換機能は使用できません。入力データをHashMapで受け取るセションBeanに対しては、execメソッドの第1引数にHashMapを指定してください。

  4. 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により、以下を利用するのに必要なクラスが提供されます。

ujiejbcl.jarは再配布可能なファイルです。クライアント環境に配布して使用できます。