OutSystemsでバッチ処理を作るのに使うTimerは、実は外部から強制的に止める手段が、(アプリレベルでは)無かったりする。
そこで、Timerでループを作るときは外部からTimerを停止できるようにロジックを組んでおくとよいかもしれない。
Timerを止めたくなるとき
たとえば、
- 開発中のTimerでうっかり無限ループを仕込んでしまった
- 長時間かかるTimerが走り始めたが、データの不備に気付いた
- 本番運用中のTimerがデータの急増等でTimeoutを超える時間動作した(Timeoutになるとエラーになるが、一定時間後リトライが走ってしまう)
- パフォーマンスや調査の都合上、今動いているTimerを一時止めたい
Service Centerには実行中のTimerを止めるUIがない
各環境でTimerを管理するUIは、Service Center > 各モジュールページ > Timersタブだが、実行中のTimerを停止することはできない。
実装案:Site Property (Boolean型)を判定し、Timerの実行を中断できるようにする
Boolean型のSite Property (Entityでもよい)としてフラグを用意しておく
Timer Actionのループでフラグをチェックして分岐させる
ループを持つTimer Actionは、ループの先頭でフラグの値をチェックし、Trueであれば直ちに処理を中止(End要素に分岐)する(下の赤枠部分)。
If要素の設定は以下のように、フラグのSite Propertyの値をセット。
Timerを停止したいときは、フラグをオンにする
操作はService Centerで行える(モジュールページ > Site Propertiesタブから)。