[OutSystems]Timer・BPTにおける未処理Exceptionの扱い

非同期で処理を実行するTimer・BPT内でExceptionを発生させ、Handleしないまま終わった場合、どうなるかを検証してみる。

# 環境
Personal Environment(Version 11.17.0 (Build 36291))
Service Studio(Version 11.53.16)

# まとめ
Timer・BPTでExceptionが発生し、Handleされないまま終わると、

- Timer: 自動でリトライされる（環境ごとに定められたリトライ回数の上限まで）
- BPT
    - Automatic Activity: User ExceptionをRaiseした場合とTimeoutしたらProcessのStatusがActive with Errors（Automatic ActivityはStatus=Error）、Automatic Activity Change ExceptionをRaiseした場合はActive（Automatic ActivityはStatus=Executing）のままとなる
    - Wait: User/Automatic Activity Change ExceptionをRaiseした場合、WaitはWaitingのままでProcessはActive
    - Human Activity: User/Automatic Activity Change ExceptionをRaiseした場合、Human ActivityはOpenのままでProcessはActive

| 要素 | Exception | 要素のStatus | Process自体のStatus |
|:-:|:-:|:-:|:-:|
| Automatic Activity  | User Exception  | Error  | Active with Errors  |
| Automatic Activity  | Abort Activity Change Exception  | Executing  | Active  |
| Automatic Activity  | (Timeoutによる)  | Error  | Active with Errors  |
| Wait  | User Exception  | Waiting  | Active  |
| Wait  | Abort Activity Change Exception  | Waiting  | Active  |
| Human Activity  | User Exception  | Open  | Active  |
| Human Activity  | Abort Activity Change Exception  | Open  | Active  |

Timerは同じ条件でリトライしたところで、同じ場所でExceptionになるだけなので、基本的にはAll Exceptionsで適切に処理したほうが良さそう。ただし、Timeoutの場合はHandleできないので、ベストプラクティスに従って、Timeoutしないように実装する必要がある。

Automatic Activity Change Exceptionは、ActivityのStatusを変えずに終わらせたいときに使う。このとき、Errorログも出力されない

# サンプルモジュール
[Forgeコンポーネント: HousesoftSampleBPT](https://www.outsystems.com/forge/component-overview/7655/housesoftsamplebpt)のV1.0.1。

モジュール > ExceptionTestFlow > ExceptionTestScreen Screen

# Timer
## ロジック中でExceptionをRaiseするTimer
Timerに紐づくAction内でUser ExceptionをRaiseし、適切なException Handlerを置かなかった場合、一定時間後にリトライされる。

TimerのActionの実装（User ExceptionをRaiseするだけ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/726f2046-446e-6f35-6390-b7f89a3bf6d0.png)

リトライ回数の上限は、[Retrying after an execution error](https://success.outsystems.com/Documentation/11/Reference/OutSystems_Language/Processes/Timer#retrying-after-an-execution-error)にある通り、Service Centerで環境単位に設定する（ドキュメントは日本語版もあるが、この記事を書いている時点で該当部分が翻訳されていなかったために英語版をリンク）。

以下のTimerログの通り、リトライ回数の上限回実行し、それでもExceptionで終わると、Next Runが本来の次回スケジュールになる（下の例では、Schedule未設定のTimerであるためdeactivated）。最後のログのError Messageを確認すると、「Timer ExceptionRaiseTimer2 reached maximum number of retries (3) [Calculating next run]」となっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/4bd8f908-1be8-c472-4a36-86187e04f318.png)

## 必ずTimeoutするTimer
[ForgeにあるSleep](https://www.outsystems.com/forge/component-overview/1244/sleep)を使って、TimerのTimeoutプロパティを確実に上回る時間Sleepすることで、TimerのAction中でTimeoutさせてみる。

2分Sleepさせる設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9bb65399-2edd-c3cd-f971-2d74450e8794.png)

TimerのTimeoutプロパティは1分にしておく
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/56817593-7ec9-e1b7-728e-401c2b5bc32a.png)

この状態だと、Timerの実行は確実にTimeoutにかかり、エラーとなる。
エラー発生時のログはリトライ回数の上限 * 2 + 1個出るようだ。最後の+1はUser ExceptionをRaiseした場合と同じく、リトライ回数の上限に達したことを示すメッセージ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/9ec65d71-4ba7-17dc-cef8-c81bf7c9b382.png)

# BPT
## Automatic ActivityでExceptionを発生させる
以下のように、必ずExceptionをRaiseするAutomatic Activtityを実装して、動作を確認する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/7e6a0788-e3c8-e79c-b9b9-ffb83cdab698.png)

### User ExceptionをRaiseした場合
ActivityのStatusがError、Process InstanceのStatusがActive with Errorsになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/78ebbf93-2e9a-8377-7435-a58642221607.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/4479c535-5d5c-7a93-2f7f-3cdf83645464.png)

### Abort Activity Change ExceptionをRaiseした場合
ActivityのStatusがExecuting、Process InstanceのStatusがActiveになった。
(Activityの詳細を見るとNext Runが設定されているのでリトライされている）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/1d96494f-8c08-8e65-f9a9-2662426dbe27.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/bd500120-00c6-47af-473e-5e831343c634.png)

## WaitのOn Close Callback
BPTのWait（一定のタイミングやイベントまでProcessの実行を停止する）は終了時にコールバックを指定できる（On Close）ので、そこでExceptionをRaiseしてみた。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a93a0358-bc5b-0a6f-5aab-7c16d76d471e.png)
（常にFalseになるIfをおき、FalseのときはExceptionをRaiseする実装）

### User ExceptionをRaiseした場合
WaitのStatusがWaiting、Process InstanceのStatusがActiveになった。
(Activityの詳細を見るとNext Runが設定されているのでもう一度Waitが開始している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/05a31dd6-6f0f-991f-44a6-985c40694bf4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c8a8ccd5-c3a6-bdce-ed6d-ed8fb7ee538d.png)

### Abort Activity Change ExceptionをRaiseした場合
WaitのStatusがWaiting、Process InstanceのStatusがActiveになった。
(Activityの詳細を見るとNext Runが設定されているのでもう一度Waitが開始している）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a22f98e2-caec-d088-e91f-5be9a5839f21.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/252fdf03-673a-29e5-c0eb-10f0ba54d1a3.png)

どうも、Abort Activity Change ExceptionをRaiseしたときError Logに記録されないようだ。

## Human ActivityのOn Close Callback
Human Activity（人にタスクを割り当てる）も終了時にコールバックがある。On CloseのコールバックでExceptionをRaiseして結果を確認してみる。
### User ExceptionをRaiseした場合
Human ActivityのStatusがOpen、Process InstanceのStatusがActiveになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3519a771-5f16-b30d-de5f-2f4e1ecdd648.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/8f20bc27-4966-4c67-ea7f-83d7d68e3378.png)

### Abort Activity Change ExceptionをRaiseした場合
Human ActivityのStatusがOpen、Process InstanceのStatusがActiveになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/3fb4bf2c-883c-8b42-0afe-aa0f6fc25dd8.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b5950957-0521-5dc7-7e64-da7759f5d6e7.png)

## Automatic ActivityをTimeoutさせる
Automatic Activityには内部的なTimeout（たしか5分）があるので、6分間Sleepさせる処理を書いてTimeoutさせ、動作を確認する。

ActivityのStatusがError、Process InstanceのStatusがActive with Errorsになった。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/a2a5882c-64e3-3544-51fe-a397c291f3a5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/135b7e86-0d07-ac3b-956e-8d8d2385d63c.png)