66.4. プロセスエンジンのスレッド
論理 および 技術 の 2 種類のマルチスレッドを参照できます。技術的なマルチスレッド には、Java や C プログラムなどにより開始される複数のスレッドまたはプロセスが必要です。論理マルチスレッド は、たとえば、プロセスが並列ゲートウェイに到達すると、BPM プロセスで実行されます。実行ロジックでは、元のプロセスは並行方式で実行する 2 つのプロセスに分割されます。
プロセスエンジンコードは、1 つの技術スレッドを使用して論理マルチスレッドを実装します。
この設計の理由は、複数の (技術的な) スレッドが同じプロセスで作業している場合に状態情報を相互に通信できる必要があることです。この要件により、多くの問題が発生します。スレッド間の安全な通信に必要な追加のロジックや、競合状態やデッドロックを回避するために追加のオーバーヘッドが発生すると、このようなスレッドの使用によるパフォーマンス上のメリットがなくなります。
一般的に、プロセスエンジンは連続してアクションを実行します。たとえば、プロセスエンジンがプロセスでスクリプトタスクに遭遇すると、スクリプトが同期的に実行し、スクリプトが完了するのを待ってから、プロセスエンジンの実行を続行します。同様に、プロセスが並列ゲートウェイに遭遇すると、プロセスエンジンは各発信ブランチを順番にトリガーします。
これは、実行がほぼ常にインスタンス化されるため可能です。つまり、非常に高速でオーバーヘッドがほぼ発生しないためです。その結果、順次実行を実行しても、ユーザーに通知できる影響は作成されません。
指定したプロセスのコードはすべて同期的に実行され、プロセスエンジンは完了するまで待機してからプロセスを続行します。たとえば、カスタムスクリプトの一部として Thread.sleep(…) を使用する場合、プロセスエンジンスレッドはスリープ期間中にブロックされます。
プロセスがサービスタスクに到達すると、プロセスエンジンはタスクのハンドラーも同期的に呼び出し、completeWorkItem(…) メソッドが戻るのを待ってから実行を継続します。サービスハンドラーがインスタンス化されていない場合は、コードに非同期実行を個別に実装します。
たとえば、サービスタスクが外部サービスを呼び出す場合があります。このサービスをリモートで呼び出し、その結果を待機する遅延は大きな可能性があります。したがって、このサービスを非同期で呼び出します。ハンドラーはサービスのみを呼び出してからメソッドを返し、その結果が利用可能になったらプロセスエンジンに通知します。その間、プロセスエンジンはプロセスの実行を継続できます。
ヒューマンタスクは、非同期で呼び出す必要のあるサービスの典型的な例です。ヒューマンタスクでは、要求に応答するためのヒューマンアクターが必要で、プロセスエンジンはこの応答を待ちません。
ヒューマンタスクノードが開始すると、ヒューマンタスクハンドラーは割り当てられたアクターのタスクリストに新しいタスクのみを作成します。その後、プロセスエンジンは、必要に応じて残りのプロセスで実行を継続できます。ハンドラーは、ユーザーがタスクを完了するとプロセスエンジンに非同期的に通知します。