IM-BPM for Accel Platform IM-BPM チュートリアルガイド 第18版 2021-04-01

4.3.15.1. 排他ゲートウェイを使用する

このチュートリアルでは、「排他ゲートウェイ」を使用してプロセスの遷移先の選択や合流の定義方法を解説します。
「排他ゲートウェイ」を使用することで、最初にtrueと評価された1つのシーケンスフローだけが継続して次の処理に進むフローを作成できます。
「排他ゲートウェイ」の詳細については、「IM-BPM プロセスデザイナ 操作ガイド」 - 「ゲートウェイ」 - 「排他ゲートウェイ」もあわせて参照してください。

コラム

このチュートリアルで作成するプロセス定義のサンプルを以下のリンクからダウンロードできます。

このサンプルは「プロセス定義アップロード」機能でプロジェクトにアップロードできます。
アップロード手順は「IM-BPM プロセスデザイナ 操作ガイド」-「プロセス定義のアップロード」を参照してください。

4.3.15.1.1. 排他ゲートウェイを使用し、複数の分岐先から1つの遷移先を選択する

以下の図は、現在時と作業名をログ出力するプロセスです。
スクリプトタスクで取得した現在時刻によって、排他ゲートウェイで分岐します。
分岐した先では、現在時に対応する作業名を取得するスクリプトタスクを実行します。
../../../../_images/exclusive_gateway_0002.png
図:完成イメージ
  1. スクリプトタスク「時間を取得する」 のプロパティを設定します。

    ../../../../_images/exclusive_gateway_0003.png
    図:スクリプトタスク「時間を取得する」

    スクリプトタスク「時間を取得する」に、現在の時間を取得し変数 hour に格納するスクリプトを設定します。

    function run(variables, execution, entity) {
      var dateTime = new DateTime();
    
      entity.setVariable('hour', dateTime.hourOfDay);
    }
    ../../../../_images/exclusive_gateway_0004.png
    図:スクリプトタスク「時間を取得する」の「プロパティエリア」-「メインコンフィグ」-「スクリプト」
  2. 排他ゲートウェイのプロパティを設定します。
    ../../../../_images/exclusive_gateway_0005.png
    図:排他ゲートウェイ「今何時?」
    分岐の開始となる排他ゲートウェイ「今何時?」に「デフォルトフロー」として sequence-flow_6 (スクリプトタスク「その他」に接続されているシーケンスフロー)を設定します。
    結合側の排他ゲートウェイでは特別なプロパティの設定を行う必要はありません。
    ../../../../_images/exclusive_gateway_0006.png
    図:排他ゲートウェイ「今何時?」の「プロパティエリア」-「基本情報」-「デフォルトフロー」
  3. シーケンスフロー「sequence-flow_3」の条件を設定します。

    ../../../../_images/exclusive_gateway_0007.png
    図:シーケンスフロー「sequence-flow_3」

    排他ゲートウェイ「今何時?」とスクリプトタスク「お昼」を接続しているシーケンスフロー「sequence-flow_3」 に、変数 hour12 の場合に真となる条件を設定します。

    ${hour == 12}
    
    ../../../../_images/exclusive_gateway_0008.png
    図:シーケンスフロー「sequence-flow_3」の「プロパティエリア」-「メインコンフィグ」-「条件」
  4. シーケンスフロー「sequence-flow_4」の条件を設定します。

    ../../../../_images/exclusive_gateway_0009.png
    図:シーケンスフロー「sequence-flow_4」

    排他ゲートウェイ「今何時?」とスクリプトタスク「おやつ」を接続しているシーケンスフロー「sequence-flow_4」 に、変数 hour15 の場合に真となる条件を設定します。

    ${hour == 15}
    
    ../../../../_images/exclusive_gateway_0010.png
    図:シーケンスフロー「sequence-flow_4」の「プロパティエリア」-「メインコンフィグ」-「条件」
  5. シーケンスフロー「sequence-flow_5」の条件を設定します。

    ../../../../_images/exclusive_gateway_0011.png
    図:シーケンスフロー「sequence-flow_5」

    排他ゲートウェイ「今何時?」とスクリプトタスク「仕事」を接続しているシーケンスフロー「sequence-flow_5」 に、変数 hour8 以上かつ 17 以下で、 12 ではなく、 15 でもない場合に真となる条件を設定します。

    ${(hour >= 8 && hour <= 17) && hour != 12 && hour != 15}
    
    ../../../../_images/exclusive_gateway_0012.png
    図:シーケンスフロー「sequence-flow_5」の「プロパティエリア」-「メインコンフィグ」-「条件」
  6. シーケンスフロー「sequence-flow_6」の条件を設定します。

    ../../../../_images/exclusive_gateway_0013.png
    図:スクリプトタスク「sequence-flow_6」

    排他ゲートウェイ「今何時?」とスクリプトタスク「その他」を接続しているシーケンスフロー「sequence-flow_6」は、排他ゲートウェイの「デフォルトフロー」であるため条件の設定はできません。

  7. スクリプトタスク「お昼」 のプロパティを設定します。

    ../../../../_images/exclusive_gateway_0014.png
    図:スクリプトタスク「お昼」

    スクリプトタスク「お昼」のプロパティにて、作業名 お昼 を変数 todo に格納するスクリプトを設定します。

    function run(variables, execution, entity) {
      entity.setVariable('todo', 'お昼');
    }
    ../../../../_images/exclusive_gateway_0015.png
    図:スクリプトタスク「お昼」の「プロパティエリア」-「メインコンフィグ」-「スクリプト」
  8. スクリプトタスク「おやつ」 のプロパティを設定します。

    ../../../../_images/exclusive_gateway_0016.png
    図:スクリプトタスク「おやつ」

    スクリプトタスク「おやつ」のプロパティにて、作業名 おやつ を変数 todo に格納するスクリプトを設定します。

    function run(variables, execution, entity) {
      entity.setVariable('todo', 'おやつ');
    }
    ../../../../_images/exclusive_gateway_0017.png
    図:スクリプトタスク「おやつ」の「プロパティエリア」-「メインコンフィグ」-「スクリプト」
  9. スクリプトタスク「仕事」 のプロパティを設定します。

    ../../../../_images/exclusive_gateway_0018.png
    図:スクリプトタスク「仕事」

    スクリプトタスク「仕事」のプロパティにて、作業名 仕事 を変数 todo に格納するスクリプトを設定します。

    function run(variables, execution, entity) {
      entity.setVariable('todo', '仕事');
    }
    ../../../../_images/exclusive_gateway_0019.png
    図:スクリプトタスク「おやつ」の「プロパティエリア」-「メインコンフィグ」-「スクリプト」
  10. スクリプトタスク「その他」 のプロパティを設定します。

    ../../../../_images/exclusive_gateway_0020.png
    図:スクリプトタスク「その他」

    スクリプトタスク「その他」のプロパティにて、作業名 その他 を変数 todo に格納するスクリプトを設定します。

    function run(variables, execution, entity) {
      entity.setVariable('todo', 'その他');
    }
    ../../../../_images/exclusive_gateway_0021.png
    図:スクリプトタスク「その他」の「プロパティエリア」-「メインコンフィグ」-「スクリプト」
  11. スクリプトタスク「結果を表示する」のプロパティを設定します。

    ../../../../_images/exclusive_gateway_0022.png
    図:スクリプトタスク「結果を表示する」

    スクリプトタスク「結果を表示する」に、変数 hour と変数 todo を組み合わせ、変数 timeAndTodo に格納するスクリプトを設定します。

    function run(variables, execution, entity) {
      Debug.console('TIME:' + parseInt(entity.getVariable('hour')) + ', TODO:' + entity.getVariable('todo') + '.');
    
      entity.setVariable('timeAndTodo','TIME:' + parseInt(entity.getVariable('hour')) + ', TODO:' + entity.getVariable('todo') + '.');
    }
    ../../../../_images/exclusive_gateway_0023.png
    図:スクリプトタスク「結果を表示する」の「プロパティエリア」-「メインコンフィグ」-「スクリプト」
  12. 実行結果を確認します。

    上記で作成したプロセスを実行環境にデプロイし、実行した結果の確認を行います。

    ../../../../_images/exclusive_gateway_0024.png
    図:結果表示
    ../../../../_images/exclusive_gateway_0025.png
    図:変数一覧

コラム

排他ゲートウェイ

排他ゲートウェイでは複数のシーケンスフローの条件が真となる場合、最初に条件が真となるシーケンスフローへ遷移を行います。

コラム

デフォルトフロー

排他ゲートウェイでは、シーケンスフローの条件が真となるものが存在しない場合、実行の際にエラーが発生します。そのため、シーケンスフローの条件が真となるものが存在しない可能性がある場合、デフォルトフローを設定するようにしてください。
デフォルトフローの詳細については、「IM-BPM プロセスデザイナ 操作ガイド」 - 「ゲートウェイ」 - 「デフォルトフロー」もあわせて参照してください。