Show Table of Contents
6.11. トランザクション境界
「グラフ実行」 で説明したように、 ビジネスプロセスマネージャーはクライアントのスレッドでプロセスを実行し、 本質的に同期処理されます。 つまり、
token.signal() や taskInstance.end() は、 プロセスが新たに wait state に入った時のみ返されます。
注記
本項で説明した JPDL 機能に関する詳細は、 10章非同期の続行 を参照してください。
プロセス実行をサーバー側トランザクションにバインドするのは簡単であるため、 ほとんどの状況でこれが最も分かりやすい方法です。 プロセスは、 1 つのトランザクション内である状態から次の状態に移動します。
インプロセスでの算出に時間が掛かる場合、この動作は望ましくないないかもしれません。この問題に対応するには、ビジネスプロセスマネージャーに非同期でプロセスを継続できるようにする非同期メッセージングシステムが含まれるようにします (Java エンタープライズ環境では、 組み込みのメッセージングシステムの代わりに、 Java Message Service を使用するよう JBPM を設定することができます)。
JPDL は属性
async="true" 属性をすべてのノードでサポートします。非同期ノードはクライアントのスレッドで実行されません。代わりに、非同期メッセージングシステム上にメッセージが送信され、スレッドがクライアントに返されます (token.signal() か taskInstance.end() が返されます)。
ビジネスプロセスマネージャーのクライアントコードはトランザクションをコミットできるようになりました。 プロセスの更新が含まれる同じトランザクションでメッセージを送信します (このようなトランザクションの結果として、ト ークンがまだ実行されていない次のノードへ移動し、
org.jbpm.command.ExecuteNodeCommand メッセージが、 非同期メッセージングシステムから jBPM Command Executor へ送信されます。 これがキューからコマンドを読み取り、 コマンドを実行します。 org.jbpm.command.ExecuteNodeCommand の場合、 ノードが実行されるとプロセスが継続されます。 各コマンドは個別のトランザクションで実行されます)。
重要
非同期プロセスが継続されるよう、
jBPM Command Executor が実行しているようにしてください。 これには、 Web アプリケーションの CommandExecutionServlet を設定します。
注記
プロセスモデラーは、 非同期メッセージについて過度に心配する必要はありません。 注意すべき主な点はトランザクション境界です。 デフォルトで、 ビジネスプロセスマネージャーはクライアントのトランザクションで操作し、 プロセスが
wait state になるまで全体の計算を行います (プロセスでトランザクションの境界を設定するには、 async="true" を使用します)。
例は次の通りです。
<start-state> <transition to="one" /> </start-state> <node async="true" name="one"> <action class="com...MyAutomaticAction" /> <transition to="two" /> </node> <node async="true" name="two"> <action class="com...MyAutomaticAction" /> <transition to="three" /> </node> <node async="true" name="three"> <action class="com...MyAutomaticAction" /> <transition to="end" /> </node> <end-state name="end" /> ...
プロセス実行の開始と再開に必要なクライアントコードは、 通常の動機プロセスで必要となるクライアントコードと全く同じです。
//start a transaction
JbpmContext jbpmContext = jbpmConfiguration.createContext();
try {
ProcessInstance processInstance =
jbpmContext.newProcessInstance("my async process");
processInstance.signal();
jbpmContext.save(processInstance);
} finally {
jbpmContext.close();
}
最初のトランザクションの後、 プロセスインスタンスの
root token は node one を示し、 ExecuteNodeCommand が、 コマンドエクセキュータへ送信されます。
後続のトランザクションでは、 コマンドエクセキュータはキューからメッセージを読み込み、
node one を実行します。 実行を渡すか、 それとも wait state に入るのかをアクションが決定することができます。 アクションが実行を渡すよう決定した場合、 実行が node two に入った時にトランザクションが終了します。

Where did the comment section go?
Red Hat's documentation publication system recently went through an upgrade to enable speedier, more mobile-friendly content. We decided to re-evaluate our commenting platform to ensure that it meets your expectations and serves as an optimal feedback mechanism. During this redesign, we invite your input on providing feedback on Red Hat documentation via the discussion platform.