（OutSystems）レコード作成を起点に小さなバッチ

REST APIや画面でデータを投入し、そこを起点に一連の処理を自動実行したいとします。
せいぜい数秒で終わる処理なら、データ投入と同時にAPIやScreen Actionで実行してしまいます。
しかし、呼び出し側を待たせたくないとかちょっと重い処理なので非同期処理に分離したいときは、Light Processという機能が使えます。

# 動作確認環境
Personal Environment(Version 11.8.0 (Build 12006))
Service Studio(Version 11.7.15)

# イメージ
この記事で、検討する実装のイメージです。
1. 画面からEntityにデータを登録する（Screen Actionはそのまま終了する）
2. EntityのCreate Eventを起点にProcessが非同期で、自動的に起動する
3. ProcessはAutomatic Activity（内部はAction）１つのみで構成される（Light Processの条件の１つ。ここで、登録されたデータに対して一連の処理をする想定です）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/080dbc22-cd41-f439-b4c2-de49b6d21399.png)

# ProcessとLight Process
## Processとは
OutSystems内でワークフローや小さなバッチの実装に使える技術です。
Service StudioのProcessesタブのProcessesフォルダに作成します。
業務の流れを編集する専用のツール（ユーザーに業務を割り当て特定の操作が行われるまで待つHuman Activityや一連の処理を自動実行するAutomatic Activityなど）を持ちます。

業務の進捗を管理するEntity、API、ユーザーが操作するUI、進捗状況を管理するUIなど一揃いの道具を含む。
公式ドキュメント：[プロセスを使用する（BPT）](https://success.outsystems.com/Documentation/ja-jp/11/Developing_an_Application/Use_Processes_(BPT))

## Light Processとは
一定の条件を満たすシンプルなProcessについて、実行状況の追跡等の機能を無くす代わりに高速に実行させるもの。

- Processの中にはAutomatic Activity１つだけが配置される
    - 例は上のイメージの右側を参照
- Processの起動方法としてEntityのイベントを選択する
    - つまり、レコード追加を起点として動く
- ProcessはExpose Process Entity=Noでないといけない
    - Expose Process Entityは、ワークフローの進行中に、そのワークフローに紐づくためのEntityを作成するかどうか、というプロパティです。これがNo、つまり無しでないといけません。
- DBがSQL ServerかOracleであること

# 作成手順
## モジュールのLight Process機能を有効にする
Service Centerで対象モジュールを開きます。
Operationタブを選択し、Light Process Executionのチェックを入れて｢Apply｣をクリックします。この設定を入れておかないと、Light Processとして動かせるProcessであっても普通のProcessとして動いてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/456cb354-a8f5-ee4b-b126-4aa18d9b1641.png)

なお、この設定を変更すると、Publishが必要です。

## Entityを用意する
Light ProcessはEntityのCreateイベントをトリガーとしないといけないので、事前に入れ物となるEntityを用意しておきましょう。

このサンプルでは、「IoTEvent」というEntityを用意しました。
IoT機器から位置と何らかの情報がどんどんあがってくるEntityというイメージです。IoT機器から通信で上がってきてEntityに保存されるまでの処理と、後続の重たい処理を分離して、後者をLight Processにすることで簡易バッチとして処理する想定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9a6bbe1a-e12d-0e71-e39c-4554a935badf.png)

## Processを作成する
ProcessはService Studio右上のタブの１番目、「Processes」から作成します。
その中に更に「Processes」というフォルダがあるので、右クリック　→　Add Processを選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/5e320334-5ac6-d23b-aadb-8dae639dff3a.png)

できたProcessのプロパティから、「Lanuch On」の右のドロップダウン（「▼」）をクリックしてダイアログを開き、上で用意したEntityのCreate Actionを選択してください。
これで、Entityにレコードが作成されたときに、このProcessが起動するようになります。Light Processにするためにはこの設定が必要です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/bae3f1a4-6a7a-ced4-2e41-48688ab990d9.png)

Expose Process EntityプロパティはNoのままにしておきます。

Processの中身を実装します。
通常のAction Flowとは違うツールを使って実装しますが、Light Processで許されるのは1つのAutomatic Activityのみ。Automatic Activityは要するにServer Actionと同じ役割で、一連の処理が自動で実行されます。

Light Processの要件でEntityのCreateで起動するように設定してありますので、ProcessのInput ParameterとしてそのEntityの作成されたレコードのIdentifierが渡ってきています。それを使って作成されたEntityのレコードを取得して色々処理していくことになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7bce0de4-6bdd-3310-74f7-01b1da48c4c5.png)

## 1 Click Publish
PublishしたモジュールにLight Processが含まれていると、以下のようなメッセージが表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/e5b7fe34-3078-8e94-de22-a663ac9f3d4c.png)

また、設定が正しく出来ていれば、Service CenterにProcess Logが表示されないはずです。

# 用途/設計上の効果
さて、この機能はOutSystemsのアプリケーションで何に使えるか考えてみたいと思います。

- 最初でも書いたように、エンドユーザーなどから登録されるデータで、後続処理を必要とし、かつ後続処理を待ってもらう必要がない場合。後続処理をLight Processで小さなバッチとして実装することができます
- 画面から任意に起動できる非同期バッチ
    - 重たい計算処理などを依頼だけして、結果は非同期に待っているなど
    - Timerと違って同時に複数起動できる
    - 代わりにタイムアウトが短い点に注意
- Timerなど重たい処理から、一部の処理を切り出す先として

# 参考資料
公式ドキュメント
[軽量プロセスを使用して拡張性の高いデータベースキューイングを設計する](https://success.outsystems.com/Documentation/ja-jp/11/Developing_an_Application/Use_Processes_(BPT)/Design_Scalable_Database_Queueing_Using_Light_Processes)

NextStep 2019でLight Processを紹介するセッションもありました。
[What Is Light BPT and How Can You Use it for Parallel Processing? - NextStep2019](https://www.outsystems.com/nextstep/2019/?wchannelid=lxt52ix89e&wvideoid=309ns5nmjy)