きよくらの備忘録

「三日坊主と呼ばせない!日記」改め。主にソフトウェア開発関連の話題。

Hangfireを使ってみる (5):Jobの種類について:2. Delayed

前回の続きです。

今回は二つ目のタイプのジョブについて。

2.Delayed

指定した時間の経過後に遅延実行されるタイプ。 BackgroundJob.Schedule()またはBackgroundJob.Schedule<T>()で登録する際にTimeSpan型で指定した時間を経過した後に実行されます。

ドキュメントとしてはこちらを参照 : Calling methods with delay

コード例

遅延時間はTimeSpan型で指定します。例えば10分後だとこんな指定です。

BackgroundJob.Schedule<MyJobsLib.ICostomJob>(x => x.Execute("Job Executed."), TimeSpan.FromMinutes(10));

ダッシュボード表示

ダッシュボードを見るとこんな感じになってます。

f:id:kiyokura:20170806144051p:plain

Jobテーブル

jobテーブル上のステータスはScheduledになってます。

f:id:kiyokura:20170806144148p:plain

Setテーブル

そしてSetテーブルになにやらエントリが作られています。

f:id:kiyokura:20170806144717p:plain

Score列に1501998606という値が入っています。この値についてドキュメントでの言及を見つけることはできなかったのですが、ソースを見る限りは以下のようです*1

  1. SetテーブルのScore列(float型)には実行時のUNIXエポックからのUTCの秒数が格納されいる
  2. Hangfire Serverがスケジュールをポーリング
  3. 現在日時とScoreから算出される日時を比較し経過していたら実行される

当初は上記 3 のタイミングで、一度キューに入れられた後改めでキューがポーリングされたタイミングで実際に実行される……と思ったのですが、動きを見る分にはどうもそういうわけではなく、スケジュールのポーリングのタイミングで実行まで行われてるように見えました*2

スケジュールのポーリングの設定

既にスケジュールはHangfire Serverからポーリングされて実行されることについては書きましたが、ついでにこのポーリング間隔の設定にも触れておきます。

Delayedの場合のスケジュールは、Hangfire ServerのオプションであるBackgroundJobServerOptionsSchedulePollingIntervalで決められています。これも規定値は15秒で、秒以上の単位でカスタマイズできるようです。この設定についても先に紹介したドキュメントで触れられています。

次回

次は 『Continuations』タイプのジョブ実行について書きます。

*1:ざっと見ただけなので違ってるかもしれません

*2:これについてはソースまで読んでないので定かではないですが、キューに入れて次のキューのポーリングを待つよりも効率的ですし多分そういうことなんだろうと思ってます