TimerTrigger Attribute で指定出来る事
ここにまとまってます。
Schedule には CRON 式か TimeSpan を指定出来る
Schedule は Function の実行間隔を定義できるものです。その定義の仕方として CRON 式と TimeSpan
が使えるよという事ですな。
CRON 式は苦手なので覚書をせんとなぁと思っています。毎回 Chat GPT に作ってもらってるので、それでいいかなぁという気持ちにもなっていますが。
秒 分 時 日 月 曜日
という順番で定義するとだけ覚えておこう。複雑なのが書けなくても最低限読めるように。
TimeSpan
は正確に言うと TimeSpan 値
を指定出来る、です。なので TimeSpan.FromMinutes(1)
とかではなく、00:01:00
のようにせねばいけません。TimerTrigger Attribute
は string
しか受け付けないようになっています。
1 年に一回の起動をさせたければ、365.00:00:00
のような感じになりますね。これはこれでわかりにくい。
ちなみにですが、設定名を % で囲んでおくと Schedule に設定できます。例えば、
[Function("TimerTriggerSample")] public void Run([TimerTrigger("%SampleTimerSchedule%")] TimerInfo myTimer) { _logger.LogInformation($"C# Timer trigger function executed at: {DateTime.Now}"); if (myTimer.ScheduleStatus is not null) { _logger.LogInformation($"Next timer schedule at: {myTimer.ScheduleStatus.Next}"); } }
のように定義すると、%SampleTimerSchedule%
の設定値をそのまま使えます。AppService
上から簡単に起動間隔を修正できます。
参考:
RunOnStartup を true
に指定すると、Function Runtime の起動時に Function を実行できる
なので開発環境では true
にしておくのが便利かと思います。1h に一度起動するみたいな Function の動作確認がだるいですからね。
Function Runtime の起動時という事なので、Azure にデプロイすると例えば Function App 自体の再起動時やインスタンスのスケールアウト時に Function が実行できるということになります。本番環境で true
にするのは推奨されていないみたいですね。
ま、Timer Trigger の場合はスケールアウトしても単一のインスタンスのみでの実行になるみたいですけどね。
UseMonitor で Blob にスケジュールを記録するか切り替える
規定では true
となっていて Timer Trigger Atrbute
では false
にすることが出来ません。ただドキュメントには実行間隔が 1 分以上の場合は true
と書かれているので、未満にすると記録されないのかもしれません。
以下に答えが書いてありましたが、1 分未満の場合は false になるようです。つまり 1 分未満の場合は Blob に実行履歴が記録されません。前回の実行状態を把握できなくなるため、推奨されていません。
このコードはどんな順番で呼び出されるのか?
Blob に記録する実行状態
Blob に以下のような json を記録して実行状態を管理しています。
{ "Last": "2023-03-01T16:00:35.0115543+09:00", "Next": "2023-03-01T16:01:35+09:00", "LastUpdated": "2023-03-01T16:00:35.0115543+09:00" }
それぞれ
- Last: 前回メソッド実行日時
- Next: 前回 ScheduleStatus 更新した時点での、次のスケジュール実行予定日時
- LastUpdated: 前回 ScheduleStatus 更新した日時
という値になってます。この json
が TimerTrigger Function に Bind される TimerInfo.SchedleStatus にマッピングされます。
と書いてもあんまりよくわからないので、実際にどのタイミングで値が決まり更新されるのかコードを追っていきます。
何故スケールアウトされても単一のインスタんで実行されるのか
Blob lease の話。