プロジェクトで Quartz.NET 2.1.2 を使用しています。ほとんどの場合ICronTrigger
、 が使用されています (たとえば、トリガーの 1 つが毎日午前 4 時に起動するように設定されています)。ジョブの実行をスキップしないことが重要であるため、各ジョブは RequestRecovery を true に設定して作成されます。
IJobDetail jobDetail = JobBuilder.Create<ReportCreationJob>()
.RequestRecovery(true)
.Build();
電源がオフの場合、またはシステムが要求を処理するためにビジー状態であった場合、トリガーはスケジュールから少しずれている可能性がありますが、最終的にすべてのジョブが正常に終了することが重要です。そして、すべてのミスファイアが処理されています!
ScheduledFireTimeUtc
(この場合は午前 4 時) がジョブに渡されることは、ジョブのビジネス ロジックにとって重要です。この情報はIJobExecutionContext
1 つの状況を除いて渡されるため、すべて正常に機能します。これは、回復ジョブが実行されている場合 (電源がオフの状況、Quartz Scheduler がクラッシュした状況など) です。
リカバリ ジョブには、元のトリガーと比較して、コンテキストに異なるタイム スタンプが設定されています。ScheduledFireTimeUtc
元のトリガーと同じように取得する方法はありますか?
この情報を取得するための回避策がありますがcontext.Trigger.FinalFireTimeUtc
、元のジョブのリカバリが作成された場合のみです。ただし、このリカバリ ジョブ中にスケジューラが再びクラッシュすると、「リカバリジョブのリカバリ」が作成され、元のデータScheduledFireTimeUtc
は失われます。
以下のテストクライアントからの追加情報を追加します。
コード行の印刷IJobExecutionContext
:
string.Format("****{0}Job {1} with {0}Scheduled time={4} {0}Fired at={2} {0}Next scheduled time={3} {0}Recovering={5} {0}FinalFireTimeUtc={6} {0}***",
Environment.NewLine,
context.JobDetail.Key,
context.FireTimeUtc.HasValue ? context.FireTimeUtc.Value.ToString("r") : "NULL",
context.NextFireTimeUtc.HasValue ? context.NextFireTimeUtc.Value.ToString("r") : "NULL",
context.ScheduledFireTimeUtc.HasValue ? context.ScheduledFireTimeUtc.Value.ToString("r") : "NULL",
context.Recovering,
context.Trigger.FinalFireTimeUtc.HasValue ? context.Trigger.FinalFireTimeUtc.Value.ToString("r") : "NULL");
元のトリガーの回復が実行された場合のテスト結果 ( Tue, 23 Apr 2013 09:45:30 GMTは元の予定時刻):
***
Job TestGroup.Test10 with
Scheduled time=Tue, 23 Apr 2013 09:51:05 GMT
Fired at=Tue, 23 Apr 2013 09:51:45 GMT
Next scheduled time=NULL
Recovering=True
FinalFireTimeUtc=Tue, 23 Apr 2013 09:45:30 GMT
***
回復トリガーの回復を実行した場合のテスト結果 ( Tue , 23 Apr 2013 09:45:30 GMTは元の予定時刻ですが、回復カスケードで失われます):
***
Job TestGroup.Test10 with
Scheduled time=Tue, 23 Apr 2013 10:52:07 GMT
Fired at=Tue, 23 Apr 2013 10:52:17 GMT
Next scheduled time=NULL
Recovering=True
FinalFireTimeUtc=Tue, 23 Apr 2013 09:51:05 GMT
***