3.12.2. エンジン実行

一般的に、BPM エンジンはアクションを順番に実行します。例えば、エンジンがプロセス内でスクリプトタスクに遭遇した場合、スクリプトを動機的に実行して、このスクリプトが完了するまで待機して完了すると実行を継続します。同様に、プロセスが並行ゲートウェイに遭遇すると、外向きのブランチを順番にトリガーしていきます。実行は常に即時に行われるため、これが可能となっています。つまり、非常に早く実行されて、ほとんどオーバーヘッドを生み出さないためです。結果、ユーザーがこれが行われていることに気づきません。同様に、プロセス内のアクションスクリプトも同期的に実行され、エンジンはアクションスクリプトが完了するまで待機して終わってからプロセスを継続します。例えば、スクリプトの一部で Thread.sleep(...) を実行しても、エンジンが別の場所で実行を継続することはなく、その期間中エンジンスレッドをブロックします。
同様の原理がサービスタスクでも適用されます。プロセス内でサービスタスクに到達すると、エンジンはこのサービスのハンドラーも同期的に呼び出します。エンジンは completeWorkItem(...) メソッドが返ってくるまで待機してから、実行を継続します。お使いのサービスハンドラーが即時実行を行わない場合、サービスハンドラーがサービスを非同期的に実行することが重要です。
この例としては、外部サービスを呼び出すサービスタスクなどです。リモートでこのサービスの呼び出しを遅延して結果を待つのは長すぎるため、このサービスの呼び出しを非同期的に行うと良いでしょう。つまり、ハンドラーは、サービスの呼び出しのみを行い、エンジンの通知は後に結果が返ってきた際に行います。その間、プロセスエンジンはプロセスの実行を継続します。
非同期呼び出しの必要のあるサービスとして典型的な例は、ヒューマンタスクです。アクションを起こす人がリクエストに対応するまで、エンジンを待機させたくないためです。ヒューマンタスクハンドラーは、ヒューマンタスクノードがトリガーされるまで、(割り当てられたアクターのタスク一覧に) 新しいタスクは作成されません。エンジンは、(必要があれば) 残りのプロセスの実行を継続することができ、ハンドラーはユーザーがタスクを完了した時点で非同期的にエンジンの通知を行います。