はじめに
CAIプロセスによる実装時に、複数のプロセスを同期しながら実行したいという要件があったとします。例えば、次のような処理です。
- プロセスAの処理途中でプロセスBを実行
- プロセスAはあるステップまで処理を継続して一時停止
- プロセスBの処理結果をプロセスAに渡して、プロセスAの処理を再開
このような同期実行は、CAIプロセスをサブプロセスとすることで実装できるシナリオもあります。ただし、サブプロセスによる実装はシンプルですが、各CAIプロセス(サブプロセス)のプログラム結合度が高くなるという特徴も考慮が必要です。プログラム結合度が高いということは、以下のようなポイントについて注意が必要になることを意味します。
- ◎ 実装がシンプル
- △ 保守性の低下
たとえば、20ステップを必要とする処理があったとします。新規開発時に、この処理を10ステップのCAIプロセス2つに分割した場合、CAIプロセス数が増えるため実装の複雑性は高くなります(実装のシンプルさ)。一方で、リリース後の改修時の場面では、例えばプロジェクトの指針で修正を行ったモジュールの全パステストが必要な場合、2つのCAIプロセスに分割しているとテスト対象になるパスが少なくなります(保守性)。
では、どのようにして各CAIプロセスの結合度を低くするか? この記事で紹介するメッセージ/受信ステップを利用することで各CAIプロセスのプログラム結合度を低く保った実装が可能となります。
プログラム結合度を下げる実装を全ての場合において推奨するわけではありません。CAIを利用するプロジェクトにてプログラム結合度に関する特徴を適切に理解して、プロジェクトにおいて適当な実装方法を選択いただければと思います。
この記事は次の記事の内容を理解していることを前提としています。
メッセージ処理の実装方法
メッセージ処理 の具体的な実装方法・処理概要を言葉で説明しきることは難しいと感じています。そのため、具体的な実装と、実行方法を紹介しながら動作について補足させてもらいたいと思います。
次の手順でCAIプロセスを作成します。
-
CAIプロセスを次の設定で作成します。
- 名前を recipe-pca-stepReceiveMessage とする
- 匿名アクセス を許可する
- クラウドサーバー にデプロイする
-
タイプ=テキスト の出力フィールド out を定義します。
-
開始ステップ の メッセージタブ を選択してメッセージを追加して次のように指定します。
-
割り当てステップ を追加して出力フィールド out に 計算式 として
util:getProcessId()を指定します。

-
受信ステップ を追加して、メッセージ msgTest を受診した際に処理を再開する設定とします。
相関 セクションでは msgInput1 にフィールド out を指定しています。

-
割り当てステップ を追加してメッセージの出力フィールド outMessage にメッセージの入力フィールド msgInput2 を指定します。

-
保存してパブリッシュします。
メッセージ処理の動作確認
それでは実際の動作を確認してゆきます。
まず最初にいつも通り、CAIプロセスを実行します。
// curl コマンド
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-stepReceiveMessage
// 実行結果
{"out":"1180761592934535168"}
実行結果として、1つ目の 割り当てステップ で計算式 util:getProcessId() により取得した一意な値が返される動作を確認できます(この実行結果は配置した マイルストーンステップ により返されています)。
このタイミングでは、CAIプロセスは受信ステップでメッセージ受信を待っている状態であり、次のように実行中のステータスとなっています。

また、実行中の受信メッセージ待ちのプロセス一覧は、アプリケーション統合コンソールの プロセスメトリック > 受信キュー のページからも確認できます。

実行したプロセスに対してメッセージを送信して、受信ステップにより処理を再開させるためには、次のように CAIプロセスのURL + /event/ + メッセージの名前 に対してHTTP Requestを実行します。
// curl コマンド
curl https://<IICS・CAIサーバー>/active-bpel/public/rt/<Org ID>/recipe-pca-stepReceiveMessage/event/msgTest \
-H 'Content-Type: application/json' \
-d '
{
"msgInput1":"1180761592934535168",
"msgInput2":"this is message test"
}
'
// 実行結果
{"outMessage":"this is message test"}
受信ステップ では 相関 として、outフィールド の値を次のように指定していました。

受信ステップ は 相関フィールドの設定に一致するメッセージ を受信すると、CAIプロセスの処理を再開します。この設定により、同一のCAIプロセスを並列実行している場合でも、メッセージを送信するCAIプロセスを一意に指定できます。
このタイミングで再度、アプリケーション統合コンソールを参照すると実行していたCAIプロセスが完了している動作を確認できます。

おわりに
メッセージ処理は理解が難しいことろや、この場合はどうなるの?という疑問が湧くこともあると思います。そのような場合には、疑問を解消するためのCAIプロセスを実装して理解を深めていただけると良いと思います。

