4.5. プロセスの実行¶
プロセスの実行に関する仕様について説明します。
4.5.1. トランザクション¶
プロセスを処理する際のデータベーストランザクションは、JTA(Java Transaction API)を用いて制御されます。
プロセスの処理時に、処理の呼び出し元(上図中ではCaller (Existing Transaction))が明示的にトランザクションを開始している場合には、そのトランザクションが継続して利用されます。
この場合には、プロセスの処理内でコミットまたはロールバックが実施されず、呼び出し元の処理にトランザクションの制御が移譲されます。例えば、プロセスの処理が正常に実行された場合でも、呼び出し元の処理によりロールバックが実施された場合は、プロセスの処理結果もロールバックされます。
プロセスの処理の呼び出し元にてトランザクションが開始されていない場合には、プロセスの処理内部でトランザクションの開始およびコミットまたはロールバックが実施されます。
4.5.1.1. トランザクションの範囲¶
データベーストランザクションの範囲は、プロセス定義の設定内容により変わります。
待機を伴うアクティビティ、非同期実行オプションが設定されたアクティビティがトランザクションの開始/終了の境界地点であり、それらの地点の間のアクティビティの実行が1トランザクションの範囲です。
待機を伴うアクティビティは以下の内容を指します。
ユーザタスク
受信タスク
コールアクティビティ※ただし、呼び出し先のプロセス内に待機を伴うアクティビティが含まれる場合のみイベントゲートウェイ
シグナルキャッチイベント
メッセージキャッチイベント
タイマキャッチイベント
申請タスク
起票タスク
また、次節で説明する非同期処理(非同期実行オプションが設定されたアクティビティ)では、プロセスを実行しているスレッドとは異なるスレッド(バックグラウンドスレッド)が処理を行います。これはコールアクティビティの呼び出し先のプロセス内に非同期処理がある場合でも同様です。
項番 | 説明 |
---|---|
1 | 待機を伴うアクティビティ(ユーザタスク)に到達したため、トランザクション1が終了
|
2 | ユーザ操作(住所の入力)
|
3 | ユーザ操作(住所の入力)によりアクティビティの待機が解除され、トランザクション2を開始
|
4 | 待機を伴うアクティビティ(タイマキャッチイベント)に到達したため、トランザクション2が終了
|
5 | ユーザ操作(住所の入力)の結果として発生したトランザクションが確定し、応答を返却
|
4.5.1.2. 非同期処理¶
アクティビティには、非同期実行オプションが設定可能です。
待機を伴うアクティビティに該当しないアクティビティでも、非同期実行オプションが設定されている場合、トランザクションの開始/終了の境界地点として扱われます。
非同期実行は、バックグラウンドスレッド(分散環境時においてはプロセスの実行を行っているAPサーバ上のスレッドとは限りません)で実行されます、その為トランザクションは別途制御されます。
バックグラウンドスレッドの詳細については、後述の「ジョブ」の非同期ジョブ実行管理スレッドの項を参照してください。
項番 | 説明 |
---|---|
1 | 待機を伴うアクティビティ(ユーザタスク)に到達したため、トランザクション1が終了
|
2 | ユーザ操作(住所の入力)
|
3 | ユーザ操作(住所の入力)によりアクティビティの待機が解除され、トランザクション2を開始
|
4 | 非同期実行オプションが設定されたアクティビティに到達したため、バックグラウンドスレッドに処理を委譲するメッセージを登録し、トランザクション2を終了
|
5 | ユーザ操作(住所の入力)の結果として発生したトランザクションによる処理の結果を返却
|
6 | 処理委譲のメッセージを取得したバックグラウンドスレッドがトランザクション3を開始 |
7 | 待機を伴うアクティビティ(タイマキャッチイベント)に到達したため、トランザクション3が終了
|
4.5.1.3. 順次実行制御(排他制御)と同時実行制御(非排他制御)¶
非同期実行オプションを設定した場合、排他制御オプションを設定可能です。
プロセスインスタンス内で並列に配置されているアクティビティに排他制御が設定されている場合、排他制御が設定された処理同士が同時に実行されることはありません。
下記の例では、「ホテルの予約」、「飛行機の予約」、「コンサートチケットの予約」が非同期(バックグラウンドスレッド)で実行されますが、一つの処理が実行されている間は他の処理の実行が抑止されるため、「ホテルの予約」、「飛行機の予約」、「コンサートチケットの予約」が同時に実行されることはありません。なお、処理の実行順序は保証されません。
図:排他制御の非同期実行オプションを設定したプロセス実行イメージコラム
順次実行制御(排他制御)の範囲
順次実行制御(排他制御)にて制御を行える範囲は、プロセスインスタンス内のみです。他のプロセスインスタンスに対しては排他の制御はおよびません。同一のプロセス定義から生成された他のプロセスインスタンスであっても制御の範囲外です。プロセスインスタンスについての詳細は「プロセスインスタンス」を参照してください。プロセス定義についての詳細は「プロセス定義」を参照してください。
非同期実行オプションを設定した場合、非排他制御オプションを設定することも可能です。
非排他制御が設定されている場合、一つの処理を実行している間でも、他の処理の実行を抑止しません。そのため、複数のバックグラウンドスレッドが処理を行える状態であった場合、非排他制御が設定されたアクティビティはそれぞれ別のバックグラウンドスレッドにより同時に実行されます。
下記の例では、「ホテルの予約」、「飛行機の予約」、「コンサートチケットの予約」がそれぞれ別のバックグラウンドスレッドにより同時に実行されます。
注意
非排他制御の設定
非排他制御の非同期実行オプションを設定しプロセスの実行を行うと、複数のバックグラウンドスレッドにより並列に処理を行うことができますが、各トランザクションが複数のテーブルへ同時に更新を行った場合などで、お互いに待ち状態となってしまった場合(デッドロック)、プロセスの実行状態が次に進めず、待ち状態に留まります。
非排他制御の非同期実行オプションを設定する際には、十分な検討を行ってください。
4.5.2. エグゼキューション¶
プロセスインスタンスに含まれる実行単位を指します。
例えば、パラレルゲートウェイによって並列に分岐しているプロセスインスタンスの場合、それぞれの分岐先で実行中のアクティビティが存在します。このようなプロセスインスタンスに存在する個々の実行単位をエグゼキューションと表現します。
エグゼキューションはそれぞれ実行中のアクティビティの位置を表します。
コラム
エグゼキューションIDの取得
エグゼキューションIDは、EL式より取得できます。
${execution.id} と記述する事により取得できます。
取得したエグゼキューションIDはメッセージキャッチイベントや変数の操作時に利用します。
EL式および暗黙オブジェクトについては後述のEL式についてを参照してください。
4.5.2.1. エグゼキューションの例¶
4.5.2.1.2. 並列のプロセス¶
下記は同時並行に分岐しているプロセスで、エグゼキューションが2つ(1.ユーザタスク、2.メッセージキャッチイベント)存在します。
図:同時並行で分岐しているプロセス
4.5.2.2. スコープエグゼキューション¶
並列のプロセスの場合など、個々のエグゼキューションの他にその親となるエグゼキューション(スコープエグゼキューション)が存在する場合があります。スコープエグゼキューションはプロセスインスタンスの内部的な状態を管理するためのものであり、実行中のアクティビティの位置を表すものではありません。
4.5.2.3. 変数のスコープ¶
エグゼキューションは変数のスコープであり、エグゼキューションにひもづく任意のローカル変数を定義できます。
エグゼキューション変数を利用することで、エグゼキューションに関連した業務データを格納することが可能です。格納した業務データを検索条件に外部からエグゼキューション(エグゼキューションID)を検索することが可能です。
4.5.3. ジョブ¶
ジョブはバックグラウンドで処理が行われる単位です。
IM-BPM for Accel Platformでは、プロセスエンジン単位でバックグラウンド実行用のジョブ管理スレッドが起動します。
非同期ジョブ実行管理スレッド
非同期ジョブの実行を管理するスレッドです。設定において定められた時間間隔でジョブテーブルを監視し、条件の成立する非同期ジョブが存在した場合、そのジョブを別スレッドで実行します。タイマ実行管理スレッド
タイマが設定されたジョブを管理するスレッドです。設定において定められた時間間隔でジョブテーブルを監視し、条件の成立するジョブが存在した場合、そのジョブを別スレッドで実行します。
ジョブ実行は、ジョブ取得時にロックされていないジョブを対象とします。
ジョブ実行直前に、そのジョブに対してロックを行います。 (ジョブレコードの更新)
ジョブのロックは、楽観的排他制御を用いて行われます。
また、ジョブ実行中に何らかの例外が発生した場合、ジョブの実行に失敗したという内容をデータベースへコミットします。
その上で、ジョブ管理スレッドは指定された回数ジョブの実行をリトライし、指定回数分リトライに失敗した場合、それ以上リトライを行いません。
項番 | 説明 |
---|---|
1 | 待機を伴うアクティビティ(ユーザタスク)に到達したため、トランザクション1が終了
|
2 | ユーザ操作(到着時間の確定)
|
3 | ユーザ操作(到着時間の確定)によりアクティビティの待機が解除され、トランザクション2を開始
|
4 | 非同期処理(バックグラウンドスレッド)にて、予約可能なレストランを自動で確認し予約処理を行ったが、どのレストランも予約が失敗したため、サービスタスク(レストランの予約)の実行に失敗したという内容でジョブレコードを更新
|
5 | 一定時間毎に指定された回数(この例では2回)に達するまでサービスタスク(レストランの予約)の実行をリトライ
|
6 | 指定された回数リトライを行っても、サービスタスク(レストランの予約)の実行が成功しなかったため、サービスタスク(レストランの予約)の再実行のトリガを待機
|
コラム
ジョブの実行環境
分散環境時においては、ジョブはどのサーバ上で動作するか保証はされていません。
コラム
ジョブのトランザクション制御
ジョブ実行時のスレッドは、JavaEEコンテキストが存在するスレッドにて動作します。その為、JTA等を利用したデータベーストランザクションの管理が可能です。