シングル・スレッドでのフローのブランチのパラレル実行に関する必知事項

シングル・スレッドではflow、flowNおよびforEachアクティビティ内のブランチはシリアルで実行されます(つまり、N番目のブランチは、N-1の実行が完了した後にのみ実行されます)。実行は完全なパラレルではありません。これは、このモードでは、ブランチは複数の並行スレッドで実行されないためです。そのかわり、1つのスレッドでフローのブランチの実行が開始され、ブロック・アクティビティ(たとえば、同期のinvokeなど)に到達するまで続行されます。このときは、新しいスレッドが作成されて他のブランチの実行が開始され、プロセスは続行されます。このため、フローのブランチはパラレルで実行されている印象を受けます。このモードでは、フローのブランチにブロック・アクティビティが定義されていない場合、ブランチはやはりシリアルで実行されます。

この設計は、いくつかの理由に基づいてこのようになっています。

  • 誤ってスレッドを多く生成しすぎてシステムが高負荷状態になることがないように、シングル・スレッド処理がデフォルトの方式になっています。ただし、アダプタ・ポーリング・スレッド、BPELプロセスのサービス・エンジン・スレッド、Oracle WebLogic Serverのワーク・マネージャなど、他の場所ではスレッドをチューニングできます。

  • BPELプロセスの仕様では、純粋なマルチスレッド・プログラミングに必要なBPEL変数のスレッド・セーフティが保証されるメカニズムは提供されていません(つまり、Javaなどにおける同期修飾子がサポートされていません)。

  • ブランチの1つでのトランザクションのロールバックの実装は定義されていません。

疑似的なパラレル処理を実現するには、デプロイメント・ディスクリプタのプロパティnonBlockingInvokeを使用して、invokeアクティビティをブロックしないように構成できます。このプロパティをtrueに設定すると、各ブランチのinvokeアクティビティをパラレルで実行するための新しいスレッドが作成されます。

nonBlockingInvokeプロパティの詳細は、「プロパティ・インスペクタでデプロイメント・ディスクリプタのプロパティを定義する方法」を参照してください。