Timer全体については、以下の記事で、OutSystems 11と比較しながら見た。
その中で、ODCのTimerについては、Timer毎に個別のコンテナが作られ、コンテナ内でスケジュールを管理するという記述があった (cronを使っているらしい)。
次回実行管理の仕組みが(O11から)変わっていることから、実行中にWake Timer Actionを使った場合の動作がどうなるかを確認しておきたい。
環境情報
ODC Studio(Version 1.4.21)
先に結論(確認結果)
- Timer実行中にWake Timerを呼ぶと、Timer終了後、再び動き始める
- このときNext runには何も設定されない(ODC Portalから、未実行のTimer実行リクエストが溜まっていることは判断できない)
- Timer実行中にWake TimerをN (> 1) 回呼んでも、その後実行されるTimerは1回だけ(リクエスト全部がキューされるわけでなく、次回実行予定があるか、のフラグ管理に見える)
テスト用セットアップ
テストシナリオ
- 実行に時間がかかるTimerを準備する
- そのTimerをWake Timerで起動する画面を用意する
- 画面からWake Timerを数秒おきに実行し、以下の点を確認する
- Timerは何回実行されるか
- Next runを始めとするTimerのプロパティはどう変化するか
テスト用実装
Timerを用意
実行時間が1分になるように実装するので、わかりやすくOneMinuteTimerという名前で作成。
TimerのActionを用意
OneMinuteTimerに対応するActionの実装。
今回の検証に中身は必要ないため、(System)/Sleep Actionで1分間止めるだけにしておいた。前後でLogMessageを出力し、処理開始と終了をODC PortalのLogsで追えるようにしてある。
ScreenとWake TimerするButtonを用意
UIはScreen上にButtonを配置するだけなので省略。
Buttonのイベントハンドラーは、以下のServer Actionを呼ぶ(LogMessageはLogsで追えるように配置。Wake Timerを呼ぶ)。
動作確認
Wake Timer Actionを三回呼んだ場合
1回目のWake TimerでServer Actionの実行開始を確認後、Wake Timerを2回呼んだ後でODC Portalを確認。
Next runは設定されず。
以下はODC PortalのLogsのスクリーンショット。Message末尾が
- Start: TimerのAction開始
- End: TimerのAction終了
- Wake: Wake Timer Action呼び出し
を示す。
吹き出しに書いたように、
- 1回目のWakeによってTimerが開始されたのを、Startのログで確認してから、さらにWake Timerを2回呼んでいる
- Timer実行中のWake Timer呼び出しは空振りにはならず、実行中のTimerが終わるともう一度実行開始する
- ただし、このWake Timer呼び出しが複数あったとしてもTimerが実行されるのは一度(スクリーンショットではTimer実行中に2回Wakeされているのに、End後にTimerは一回だけ実行された)