プロセスの途中で他のアプリのプロセスを起動する「ワークフローアプリ接続」は、「見積プロセス」から「受注申請プロセス」、あるいは「納品業務プロセス」から「請求業務プロセス」など、業務プロセス同士を連携させたいケースで利用されます。また、一部の業務、例えば翻訳作業や法務審査などが独立したアプリとして定義されていれば、そのアプリを呼び出す設定だけでワークフローにサブプロセス化された業務工程を組み込むことができます。
「アプリ分割編」では、複数の部署をまたぐアプリを部署ごとに分割し、上流アプリのプロセスから下流アプリのプロセスを開始する設定について説明しました。
本記事では、親アプリから子アプリを起動し、親アプリが子アプリの完了を待ち受けて子アプリから業務データを受け取るという、サブプロセスを構築する方法について説明します。
(参考 M413: フロー途中でサブプロセスを呼び出し、その処理結果を待つように設定する)
サブプロセスを定義する
文章の翻訳作業やグラフィックデザインの作成作業などは、様々な業務の途中で必要とされるケースは少なくありません。このような作業が単純な作業依頼のワークフローアプリとして定義されていれば、様々な部署からの依頼に応じて作業を行うことができます。
ワークフローアプリが呼び出されて業務の一部として組み込まれる仕組みは「サブプロセス」と呼ばれます。多くのサブプロセスでは、作業結果(成果物:翻訳作業であれば翻訳文)の業務データを呼び出し元のプロセスに返す仕組みが必要となります。
本記事では「アプリ分割編」で例に挙げた「受注~発送~請求フロー」を土台に、子プロセスを自動で呼び出すだけでなく、子プロセスの作業終了を待って作業結果の業務データを親プロセスに返すための設定方法について説明します。
具体的には、「営業部上司」が「2. 受注確認」工程で承認すると配送部門のアプリが起動されて発送業務が始まるように設計します。今回は、配送完了時の受領証の画像ファイルを、営業部門の受注業務のプロセスに受け渡すことで配送の完了を報告するという想定です。サブプロセスの位置づけとしては「各支社での受注に対応する、配送センターでの発送業務」と考えられます。

なお、本記事では呼び出す側の「受注業務アプリ」(営業部)のプロセスを「親プロセス」、呼び出される側となる「発送業務アプリ」(配送部)のプロセスを「子プロセス」と呼ぶこととします。
ワークフローアプリ接続に使用するアイテム
「複数のワークフローアプリを連携させて運用する ー アプリ分割編」で使用したアイテムと同じものを使用します。ただし、今回はサブプロセスの処理結果を受け取ってから処理を先に進めるように定義するので、[サービスタスク(子プロセス開始)]の[子プロセスの終了を待つ]オプションを利用します。
[子プロセスの終了を待つ]オプション
[サービスタスク(子プロセス開始)]の[子プロセスから受け取る値]タブにある[P2: 子プロセスの終了を待つ]オプションを有効にすると以下のように動作します。
子プロセスの終了まで滞留
子プロセスが終了するまでトークンを保持し、フローを滞留させます。親プロセスは開始された子プロセスを監視(ポーリング)し、子プロセスの[状態]が「終了(または異常終了)」となるまで滞留が続きます。
子プロセスのデータを取得
親プロセスは、子プロセスの終了を感知したときに子プロセスにアクセスし、子プロセスのデータを取得します。値を取得できるデータ項目は、子プロセスのアプリ設定にて許可されているものに限られます。
サンプルアプリ
配送部の「発送業務アプリ」(呼び出される側)
前記事での手順と同様に、配送部の「発送業務アプリ」(子プロセス側)から作成します。
先頭に[メッセージ開始イベント (HTTP)]を配置し、プロパティ画面の[編集の可否]にて営業部の「受注業務アプリ」からデータを受け取り保存するデータ項目を[ 編集可]に設定します。

データ項目
データ項目名 | データ型 | フィールド名 | 必須 | 説明 |
件名 | – | – | – | |
配送先名称 | 文字型 (単一行) | q_delivery_name | – | |
配送先住所 | 文字型 (複数行) | q_delivery_address | – | |
発送明細 | テーブル型 | q_item_list | – | |
受領証 | ファイル型 | q_receipt | ✓ | |
呼出元プロセス ID | 文字型 (単一行) | q_parent_id | – | 初期値:#{parentProcessInstanceId} |
- データ項目「呼出元プロセス ID」の初期値に設定している EL式は[親プロセス ID]をセットするものです
- Questetra BPM Suite からの HTTP リクエストで開始されたプロセスは、呼び出し元の親プロセスのプロセス ID をシステム変数[親プロセス ID]として参照できるようになります(parentProcessInstanceId)
「発送開始」([メッセージ開始イベント (HTTP)])
データ項目名 | 編集の可否 |
件名 | ![]() |
配送先名称 | ![]() |
発送明細 | ![]() |
配送先住所 | ![]() |
受領証 | ![]() |
呼出元プロセス ID | ![]() |
ここまでの設定は「アプリ分割編」と同様です。
今回は、[メッセージ開始イベント (HTTP)]設定画面にある[親プロセスからのデータ可視性]の設定を行います。ボタンをクリックして設定画面を開き、「受領証」のみ[許可]に設定します。ここで[許可]に設定された項目は、親アプリの[サービスタスク(子プロセス開始)]設定画面の[子プロセスから受け取る値]タブでの設定項目に追加されます。

設定が完了したら編集画面を閉じてアプリを[リリース]します。画面上部の[アプリID](m数字)と[アプリ名]を確認してください。
営業部の「受注業務アプリ」(呼び出す側)
前記事で作成した営業部の「受注業務アプリ」(親プロセス側)を編集します。
編集画面のパレットの[自動処理タスク]>[他のワークフローアプリとの連携]から配送部の「発送業務アプリ」を呼び出すアイコンを設置して接続します。先に設置されている「請求書発送依頼」工程の前に設置すると「配送完了を確認したら請求する」という流れとなります。後ろに設置すれば「入金を確認すれば発送する」となります。

データ項目(追加)
配送部の「発送業務アプリ」のプロセスが終了したときに、「受領証」ファイルを受け取って保存するためのデータ項目を追加しておきます。さらに開始された子プロセスの[プロセス ID]を保存するデータ項目も追加します。
データ項目名 | データ型 | フィールド名 | 必須 | 説明 |
受領証 | ファイル型 | q_receipt | – | (子プロセスの成果物) |
子プロセス ID | 文字型 (単一行) | q_Subprocess_ID | – | (子プロセス開始時に取得されます) |
- 文字型データ、日時型データなど他のデータ型のデータも受け渡しできます
- 保存するデータ項目のデータ型を同じにしておく必要があります
- 掲示板型とガイドパネル型は受け渡しの対象にできません
「配送依頼」工程([サービスタスク(子プロセス開始)])
[子プロセスに渡す値]タブでの設定項目は「アプリ分割編」と同様に設定します。これが「サブプロセスを呼び出す」設定となります。
項目名 | 設定内容 |
At: 件名 | #{processInstanceTitle}(「件名」を選択) |
A0: 配送先名称 | #{#q_name}(「受注先名」を選択) |
A1: 配送先住所 | #{#q_address}(「受注先住所」を選択) |
A5: 発送明細 | 売上明細(を選択) |
[子プロセスから受け取る値]タブで[P2: 子プロセスの終了を待つ]オプションをオンにします。これにより「親プロセスが子プロセスの終了を待ち受ける」設定になります。オプションをオンにすると取得可能な子プロセスのデータ項目が設定項目として表示されますので、格納するデータ項目を指定します。これで「子プロセスが終了したらデータを受け取る」設定となります。
項目名 | 設定内容 |
P1: 開始した子プロセスの ID を保存するデータ項目 | 子プロセス ID(を選択) |
P2: 子プロセスの終了を待つ | オンにする |
RT: 件名 | 今回は設定しません(空白) |
R3: 受領証 | 受領証(を選択) |

ここまで設定できれば、サブプロセスを呼び出し、サブプロセスの終了を待ち受けてサブプロセスでの成果物を受け取る仕組みが完成です。
「配送依頼」工程にて[この工程のみデバッグ]を実行してみましょう。「配送依頼」工程が処理されると「発送業務アプリ」で子プロセスがデバッグプロセスとして開始されます。今回は子プロセスの工程を、全て処理してください。「2. 納品確認」工程では、ファイル型データ項目「受領証」にスマートフォンで撮影した受領証の画像を添付する想定です。ファイルを添付して「2. 納品確認」工程を終了すれば配送部の「発送業務」プロセスが終了します。
[この工程のみデバッグ]を実行した「受注業務アプリ」のプロセスの詳細を確認します。子プロセスの終了をもって親プロセスも終了しているので、[全プロセス]一覧から該当するプロセスを見つけてください。詳細画面のデータ項目「受領証」に添付したファイルが格納されていることが確認できます。
- 子プロセスの詳細画面では、[プロセス開始ユーザ]の表示箇所に[親プロセス ID]が代わりにリンク表示されます
- [全プロセス]一覧から子プロセスの詳細を開いて、上記リンクから親プロセスを開くこともできます


[サービスタスク(子プロセス開始)]工程は、一連の処理がすべて正常に完了すれば[処理完了]となります。本記事では、サブプロセス(子プロセス)を開始するところから、サブプロセスが終了してデータを受け取るところまでが一連の処理です。
一連の処理で何らかの不具合が発生した場合、[サービスタスク(子プロセス開始)]工程は[エラー終了]となります。不具合の例として、データの受け渡しでエラーが発生した場合や、子プロセスが[強制終了]や[削除]などで正常終了しなかった場合があげられます。
[エラー終了]となる場合、トークンを[エラー境界イベント]の接続先へ進めることもできます。工程の設定にて[処理失敗時に、トークンをエラー境界イベントに移動]オプションを有効にしてください。
[エラー終了]した後の処理を、子プロセスが開始したかどうかで分けたい場合が考えられます。[開始した子プロセスの ID を保存するデータ項目]に保存された値の有無を分岐条件に指定して、フローを分岐させてください。
サブプロセスがエラーとなった場合の処理を定義する際は、以上を踏まえて、[エラー境界イベント]の先のフローを設計してください。
Appendix
[サービスタスク(子プロセス開始)]で子プロセスからデータを受け取る場合は、子プロセスが終了するまで親プロセスのフローは進みません。
例えば「翻訳が完了するまでに他の作業を進めたい」場合は並行分岐を検討します。
