EJB クライアント・アプリケーションは、Bean のホーム・
インターフェースを介して、適切なリモート・セッション Bean にアクセスします。
このタスクを実行する理由と実行時期
セッション Bean は、プロセス・
アプリケーションに対しては BusinessFlowManager セッション
Bean、タスク・アプリケーションに対しては
HumanTaskManager セッション Bean のいずれかである可能性
があります。
このタスクのステップ
- リモート・セッション Bean への参照を
アプリケーション・デプロイメント記述子に追加します。 参照を以下のファイルの 1 つに追加します。
- Java™ 2 Platform Enterprise Edition (J2EE)
クライアント・アプリケーションの場合は、application-client.xml ファイル
- Web アプリケーションの場合は、web.xml
ファイル
- Enterprise JavaBeans™ (EJB) アプリケーションの
場合は、ejb-jar.xml ファイル
プロセス・アプリケーションの場合のリモート
・ホーム・インターフェースへの参照は、以下の例で
示されます。
<ejb-ref>
<ejb-ref-name>ejb/BusinessFlowManagerHome</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.ibm.bpe.api.BusinessFlowManagerHome</home>
<remote>com.ibm.bpe.api.BusinessFlowManager</remote>
</ejb-ref>
タスク・
アプリケーションの場合のリモート・ホーム・
インターフェースへの参照は、以下の例で示されます。
<ejb-ref>
<ejb-ref-name>ejb/HumanTaskManagerHome</ejb-ref-name>
<ejb-ref-type>Session</ejb-ref-type>
<home>com.ibm.task.api.HumanTaskManagerHome</home>
<remote>com.ibm.task.api.HumanTaskManager</remote>
</ejb-ref>
WebSphere® Integration Developer を使用して EJB 参照を
デプロイメント記述子に追加する場合、EJB 参照のバインディングが、アプリケーションのデプロイ時に
自動的に作成されます。EJB 参照の追加について
詳しくは、WebSphere Integration Developer の文書を
参照してください。
- 生成されたスタブをアプリケーションに
パッケージします。
ご使用の
アプリケーションが、BPEContainer アプリケーションまたは TaskContainer アプリケーションを実行しているのと
異なる Java 仮想マシン (JVM) で実行されている場合、
以下のアクションを完了します。
- プロセス・アプリケーションの場合、<install_root>/ProcessChoreographer/client/bpe137650.jar ファイルを、ご使用の
アプリケーションのエンタープライズ・アーカイブ (EAR)
ファイルにパッケージします。
- タスク・アプリケーションの場合、<install_root>/ProcessChoreographer/client/task137650.jar ファイルを、ご使用のアプリケーションの EAR ファイルにパッケージします。
- ビジネス・プロセスまたはヒューマン・タスクの複合データ・タイプを使用し、クライアントが EJB アプリケーションまたは Web アプリケーションで実行しない場合は、対応する XSD または WSDL ファイルを、ご使用のアプリケーションの EAR
ファイルにパッケージします。
- アプリケーション・モジュールの
マニフェスト・ファイル内の Classpath パラメーターを、JAR ファイルを含めるように設定します。
アプリケーション・モジュールは、J2EE
アプリケーション、Web アプリケーション、または EJB
アプリケーションの可能性があります。
- Java Naming and Directory Interface (JNDI) からリモート・セッション Bean のホーム・インターフェースへの参照を取得します。
以下の例では、プロセス・アプリケーションでのこのステップを示します。
// Obtain the default initial JNDI context
InitialContext initialContext = new InitialContext();
// Lookup the remote home interface of the BusinessFlowManager bean
Object result =
initialContext.lookup("java:comp/env/ejb/BusinessFlowManagerHome");
// Convert the lookup result to the proper type
BusinessFlowManagerHome processHome =
(BusinessFlowManagerHome)javax.rmi.PortableRemoteObject.narrow
(result,BusinessFlowManagerHome.class);
セッション Bean のホーム・
インターフェースには、EJB オブジェクトの create
メソッドが含まれます。
このメソッドは、セッション Bean のリモート・
インターフェースを戻します。
- セッション Bean のリモート・
インターフェースにアクセスします。
以下の例では、プロセス・アプリケーションでのこのステップを示します。
BusinessFlowManager process = processHome.create();
セッション Bean へのアクセス権は、
呼び出し元が Bean が提供するすべてのアクションを実行できることを保証するものではありません。
呼び出し元には、そのアクションに対する許可も必要になります。
セッション Bean のインスタンスを作成すると、
コンテキストとそのセッション Bean のインスタンスが関連付けられます。コンテキストには呼び出し元のプリンシパル ID、グループ・メンバーシップ・リストが含まれ、その呼び出し元に Business Process Choreographer の J2EE ロールのいずれかがあるかどうかを示します。
コンテキストは、グローバル・セキュリティーが設定されていなくても、それぞれの呼び出しごとに、
呼び出し元の権限を確認するために使用されます。グローバル・セキュリティーが設定されていない場合、
呼び出し元のプリンシパル ID の値は UNAUTHENTICATED になります。
- サービス・インターフェースによって
公開されたビジネス関数を呼び出します。
以下の例では、プロセス・アプリケーションでのこのステップを示します。
process.initiate("MyProcessModel",input);
アプリケーションからの呼び出しは、
トランザクションとして実行されます。
トランザクションは、以下のいずれかの方法で確立され
て終了します。
ヒント: データベース・デッドロックを防ぐには、並列トランザクションで以下のようなステートメントの実行を避けるようにします。
// Obtain user transaction interface
UserTransaction transaction=
(UserTransaction)initialContext.lookup("jta/usertransaction");
transaction.begin();
//read lock on the activity instance
process.getActivityInstance(aiid);
//write lock on the activity instance
process.claim(aiid);
transaction.commit();
例
以下に、ステップ 3 から 5 でタスク・アプリケーションを探す方法の例を示します。
// Obtain the default initial JNDI context
InitialContext initialContext = new InitialContext();
// Lookup the remote home interface of the HumanTaskManager bean
Object result =
initialContext.lookup("java:comp/env/ejb/HumanTaskManagerHome");
// Convert the lookup result to the proper type
HumanTaskManagerHome taskHome =
(HumanTaskManagerHome)javax.rmi.PortableRemoteObject.narrow
(result,HumanTaskManagerHome.class);
...
//Access the remote interface of the session bean.
HumanTaskManager task = taskHome.create();
...
//Call the business functions exposed by the service interface
task.callTask(tkiid,input);