4

プロジェクトで Quartz.NET 2.1.2 を使用しています。ほとんどの場合ICronTrigger、 が使用されています (たとえば、トリガーの 1 つが毎日午前 4 時に起動するように設定されています)。ジョブの実行をスキップしないことが重要であるため、各ジョブは RequestRecovery を true に設定して作成されます。

IJobDetail jobDetail = JobBuilder.Create<ReportCreationJob>()
.RequestRecovery(true)
.Build();

電源がオフの場合、またはシステムが要求を処理するためにビジー状態であった場合、トリガーはスケジュールから少しずれている可能性がありますが、最終的にすべてのジョブが正常に終了することが重要です。そして、すべてのミスファイアが処理されています!

ScheduledFireTimeUtc(この場合は午前 4 時) がジョブに渡されることは、ジョブのビジネス ロジックにとって重要です。この情報はIJobExecutionContext1 つの状況を除いて渡されるため、すべて正常に機能します。これは、回復ジョブが実行されている場合 (電源がオフの状況、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
***
4

0 に答える 0