10.2. 例

通常、トークンがノードに入場した後に、そのノードが常に実行されます。 そのため、ノードはクライアントのスレッドで実行されます。 2 つのサンプルを使用して非同期な続行を詳しく見ていきます。 最初のサンプルは、3 つのノードを持つプロセスの一部です。 'a' ノードは待機状態で、 'b' ノードは、 自動ステップ、 'c' ノードも待機状態です。 下図の通り、 このプロセスには非同期の動作がありません。
最初のフレームは、開始状況を示します。 トークンは'a'ノードを参照します。 つまり、 実行パスは外部からのトリガーを待っています。 そのトリガーは、シグナルをトークンに送ることによって起こるものでなければなりません。 シグナルが到着時、トークンは'a'ノードから遷移越しに'b'ノードに渡されます。 トークンが'b'ノードに到着後、'b'ノードは実行されます。 'b'ノードは待機状態として振る舞わない自動ステップ(例えばeメール送信)だということを思い出してください。 2個目のフレームは'b'ノードが実行されているときのスナップショットです。 'b'ノードはプロセスでは自動ステップなので、'b'ノードの実行は、 'c'ノードへ遷移するトークンの伝播も含みます。 'c'ノードは待機状態なので、3個目のフレームはsignalメソッドから戻った後の最後の状況を示しています。
サンプル 1: 非同期の続行がないプロセス

図10.1 サンプル 1: 非同期の続行がないプロセス

JBPM では「永続性」は必須ではありませんが、最も一般的にシグナルはトランザクション内で呼び出されます。トランザクションの更新を見てみましょう。最初に、トークンは 'c' ノードを示すよう更新されます。これらの更新は、JDBC 接続上の GraphSession.saveProcessInstance の呼び出しにより、Hibernate によって生成されます。2番目に自動化アクションがトランザクションリソースにアクセスし更新する場合、このような更新は同じトランザクションと組み合わされるか同じトランザクションの一部となるはずです
2 つ目のサンプルは、最初のサンプルが変形したもので、'b' ノードに非同期の続行を導入します。'a' ノードと 'c'ノードは、最初のサンプルと同様に待機状態として動作します。JPDLでは、async="true" 属性を設定するとノードが非同期としてマークされます。
async="true" を'b'ノードに追加した結果、プロセス実行は、2つに分かれます。 最初の部分は、'b'ノードが実行されるところまで、実行していきます。 2つ目の部分は、'b'ノードを実行し、'c'ノードの待機状態で止まります。
トランザクションもゆえに2つに分かれます。それぞれにひとつのトランザクションがあります。JBPMは、最初のトランザクションでは、'a'ノードを退場するのに、外部からのトリガー (Token.signal メソッドの呼び出し) を求めますが、2つ目のトランザクションは、自動的に呼び出されて実行されます。
非同期続行のプロセス

図10.2 非同期続行のプロセス

アクションも原則は似ています。属性 async="true" でマークされたアクションは、プロセス実行のスレッド外で実行されます。 永続化の設定がされている場合(デフォルトです)、アクションは別々のトランザクションで実行されます。
JBPMでは、非同期続行は非同期メッセージングシステムの利用によって実現されます。プロセス実行が非同期で実行されるところに到着したときに、 jBPMは、そのプロセスの中止、メッセージコマンドの作成、そして、コマンドエグゼキューターにメッセージコマンドを送ります。 コマンドエグゼキューターはメッセージを受け取り次第、中断したプロセス実行を再開できる依存のないコンポーネントです。
JBPM は、JMS プロバイダー、もしくは組み込み非同期メッセージングシステムの利用を設定できます。組み込み非同期メッセージングシステムは、機能的に制限がありますが、JMS が利用できない環境でもこの機能をサポートします。