5

これは私のクォーツ構成です:

  <quartz>
    <add key="quartz.scheduler.instanceName" value="EmailScheduler" />
    <!-- Configure Thread Pool -->
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="Normal" />
    <!-- Configure Job Store -->
    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
    <add key="quartz.jobStore.driverDelegateType" value="Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz" />
    <add key="quartz.jobStore.dataSource" value="default" />
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" />
    <add key="quartz.dataSource.default.connectionString" value="data source= ......" />
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
  </quartz>

ここに私のIInterruptableJob

public class JobC : Quartz.IInterruptableJob
{
    public void Interrupt()
    {
        Console.WriteLine("Job Interrupt() called at " + DateTime.Now);
    }

    public void Execute(IJobExecutionContext context)
    {
        // what code I should write here to detect misfires???
        Console.WriteLine("FireTime at " + context.FireTimeUtc.Value + " PreviousFireTime at:" + (context.PreviousFireTimeUtc.HasValue ? context.PreviousFireTimeUtc.Value.ToString() : "NULL"));
    }
}

これが私の仕事とトリガーです:

var job = JobBuilder.Create<JobC>().WithIdentity(new JobKey("JobC")).RequestRecovery(true).Build();
var trigger = TriggerBuilder.Create()
    .WithSimpleSchedule(x => x
        .RepeatForever()
        .WithIntervalInSeconds(2)
            // I'm ignoring misfires here, but seems it doesn't work!
        .WithMisfireHandlingInstructionIgnoreMisfires())
    .StartNow()
    .Build();

var scheduler = new Quartz.Impl.StdSchedulerFactory().GetScheduler();
scheduler.Start();
scheduler.ScheduleJob(job, trigger);

scheduler.PauseAll()すべてのジョブの一時停止を呼び出した後scheduler.ResumeAll()、失敗したすべての火災を呼び出した後、解雇されます! しかし、私はそれらを無視して、これから続けたいと思っています。

前もって感謝します。

4

3 に答える 3

3

トリガーが定義された失火しきい値を満たしていますか?構成の状態でしきい値が60秒の場合、失火とは見なされないが、スケジュールされた発火時刻に達したすべてのトリガーは、再開後できるだけ早く発火します。

したがって、一時停止が最小しきい値(この場合は60秒)として続く場合は、無視動作が表示されるはずです。

于 2012-11-07T16:07:21.890 に答える
3

ばかげているように思えるかもしれませんが、メソッド内の失火を検出するために、次の拡張メソッドを作成しましたExecute

public static bool IsMissedFire(this IJobExecutionContext context, int offsetMilliseconds)
{
    if (!context.ScheduledFireTimeUtc.HasValue)
        return false;
    if (!context.FireTimeUtc.HasValue)
        return false;

    var scheduledFireTimeUtc = context.ScheduledFireTimeUtc.Value;
    var fireTimeUtc = context.FireTimeUtc.Value;

    return fireTimeUtc.Subtract(scheduledFireTimeUtc).TotalMilliseconds > offsetMilliseconds;
}

使い方は簡単です:

public void Execute(IJobExecutionContext context)
{
    if (context.IsMissedFire(1000))
        Console.WriteLine("Missfire");
    else
        Console.WriteLine("Fire");
}
于 2012-11-09T13:55:13.377 に答える
2

これは Java バージョンの Quartz 用ですが、以下のリンクはさまざまな失火ポリシーの概要を示しています。

http://nurkiewicz.blogspot.co.uk/2012/04/quartz-scheduler-misfire-instructions.html

本質的に、WithMisfireHandlingInstructionIgnoreMisfires は実際には、スレッドが使用可能になるとすぐにミスファイアを実行しますが、これは非常に直感に反するようです。すべての失火を破棄してスケジュールを続行するには、withMisfireHandlingInstructionNextWithRemainingCount を使用する必要があります。

于 2012-11-20T15:02:40.510 に答える