[ODC]Server Request Timeoutにかかったとき、サーバー側の処理も停止することを確認する

OutSystemsにおける無限ループの一般的な話は以下の記事に書いた。

https://qiita.com/jyunji_watanabe/items/91db13dcd4ce0536b60e#%E9%9D%9E%E5%90%8C%E6%9C%9F%E3%81%AE%E8%A6%81%E7%B4%A0%E3%81%AFtimeout%E3%82%92%E5%BE%85%E3%81%A4%E6%96%B9%E6%B3%95%E3%82%82%E3%81%82%E3%82%8B

OutSystems 11のときは、Client Actionからサーバー処理を読んだときに無限ループを作ると、クライアントからの通信はタイムアウトしてもサーバー側はそのまま動作していた（↓の「OutSystems 11のときはどうだったか」のセクションを参照）。

この部分がODCでどうなったかを確認してみる。

# 環境情報
ODC Studio(Version 1.4.13)

# 先に結論
観察からは、Client Actionからサーバー側の処理（Server/Service Action、ODC上のREST API）を呼び、Server Request Timeoutにかかった場合、サーバー側の処理も停止されていた。

これはOutSystems 11のときとは異なる（サーバー側の処理は止まらなかった）。

# 動作確認用の実装
Server Action内で、
- (System)/Sleepで5秒間停止
- (System)/LogMessageでログ出力

を6回繰り返す（つまり30秒）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/0f4c1ad7-8094-490f-a6a9-b0c749740673.png)

このActionをClient Actionから呼び出してServer Request Timeoutを発生させ、ODC Portalではどの時点までログが出力するかを確認する。

Server Request TimeoutでCommunication Exceptionが発生したあとでサーバー側のログが止まっていれば、恐らくサーバー側の処理はクライアントのタイムアウトと同時に停止したことになる。

# 動作確認
## Server Actionで動作確認
Server Request Timeoutはデフォルトの10秒のままテストしてみる。

ブラウザの開発者ツールでネットワークタブを開き、発生したリクエストを確認するとServer Request Timeoutの10秒（厳密には一致しない）で通信がキャンセルされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/c09115a0-dbfd-38d7-e76a-8420cdadc4fd.png)

このとき、ODC Portalでは以下の通り、5秒経過時点までのログしか出ていない。つまりクライアント側で通信キャンセルが発生したときに、サーバー側の動作も停止している。このとき、「OS-BERT-00000 - A task was canceled.」というメッセージが出ている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/666f95f5-d45a-9eca-6f6c-5a00e74b98c9.png)

念の為、Server Request Timeoutを18秒まで伸ばしてテストしてみる。やはり、通信が打ち切られるまでのログは出力され、それ以降は出力されなくなる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/57a99bee-633c-4616-b514-ca452b308051.png)

よって、Client Actionから直接呼んだServer ActionがServer Request Timeoutにかかると、サーバー側の処理も停止していそう。

## Service Actionで動作確認
↑のServer ActionをService Actionにラップし、それをClient Actionから呼ぶことで動作確認した。結果は同じ、Service ActionでもServer Request Timeout時にサーバー側の処理は同時に停止している。

ブラウザの開発者ツール（10秒で打ち切り）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/b09d217a-4a9a-6049-a7e9-b022557ad393.png)

ODC Portalのログ。同じAppのService ActionをClient Actionから呼ぶことはできないので、別のAppに配置してテストを行っている。
Server Request Timeoutに到達すると、呼び出し側のAppで「OS-BERT-00000 - The operation was canceled.」が発生し、Service Actionを配置したAppで「OS-BERT-00000 - A task was canceled.」が発生している。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/371a48ff-ed69-937a-c4dd-a3d2715d025e.png)

## RESTで動作確認
↑のServer Actionを呼び出すExpose REST APIを作成し、そのExpose REST APIをConsumeする。Consume REST APIのREST API MethodをClient Actionから呼んでテストした。結果は同じ、REST API呼び出しでもServer Request Timeout時にサーバー側の処理は同時に停止している。

ブラウザの開発者ツール（10秒で打ち切り）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/76398092-ab19-34e3-ddf7-e2e2b186b73a.png)

ODC Portalのログ。これも同じく5秒経過までのログは出ているがそれ以降は出ていない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/509adaf2-5687-bef5-e4a0-da5e71f71d69.png)

# Expose REST APIをブラウザで直接呼んだ場合
このテストのために、内部では10秒Sleep -> ログ記録を7回繰り返すように変えた。
GETのAPIなので、アドレスバーにURLを直接入力して動作確認すると、約1分でHTTP Status 504 (Gateway Timeout) で通信はキャンセルされる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/332987/f85e1d20-9220-bca4-2980-76cdced0c6f5.png)

このとき、ODC Portalのログは50秒時点のものまででているが、60秒・70秒時点のものは出なかった。つまり、Gateway Timeout時点でサーバー側の処理求められていると見て良さそう。

# OutSystems 11のときはどうだったか
[タイムアウトの仕組み > Server Request Timeout](https://success.outsystems.com/ja-jp/support/troubleshooting/application_runtime/timeouts_under_the_hood/#section-16)に

> モジュールではServer Request Timeoutがデフォルトで10秒に設定されています。サーバーリクエストが10秒以内に応答しない場合、アプリケーションで通信例外がトリガーされるということです。

> こうしたリクエストはクライアント側では中止されますが、サーバーでは中止されず、IISで引き続き実行されます。

と記載がある通り、Server Request Timeout発生時にもサーバー側の処理はそのまま継続していた。