【问题标题】:Why does my Quartz trigger fire before the specified interval?为什么我的 Quartz 触发器会在指定的时间间隔之前触发?
【发布时间】:2015-05-07 12:46:05
【问题描述】:

我的目标是让 Quartz.NET 以精确的 25Hz 或每 40 毫秒执行一次作业。

我正在使用以下触发器:

ITrigger MyTrigger = TriggerBuilder.Create().WithIdentity("T1").ForJob("MyJob").WithSimpleSchedule(x => x.WithInterval(TimeSpan.FromMilliseconds(40)).RepeatForever()).Build();

还有以下工作:

[DisallowConcurrentExecution]
private class MyJob : Quartz.IJob
{
    public void Execute(IJobExecutionContext context)
    {
        Idx++;
        Console.WriteLine("Job {0} fired at {1}ms", Idx, MyStopWatch.ElapsedMilliseconds);
    }
}

问题在于前 150 次左右的处决执行得太快了。例如,前 60 次迭代都在秒表上以 20 毫秒或 21 毫秒触发。之后,它们每 200 毫秒成束发射,直到在 1000 毫秒左右稳定,然后按预期每 40-42 毫秒开始发射。

如果前一个作业在 40 毫秒内被触发,我如何防止 Quartz 触发作业?

这种行为的根源是什么?

【问题讨论】:

  • 出于好奇,您使用的是 RAMJobStore 还是 ADOJobStore?
  • 我正在使用 RAMJobStore
  • 这是一个有趣的问题——如果你在这里没有得到答案,那么你可以试试github

标签: quartz.net


【解决方案1】:

您不应该依赖 Quartz 进行毫秒级精度调度。 Quartz 有很多基础设施(失火检查、补偿等),使其不适合这种精度。

我认为在裸虚拟机级别上稳定触发也可能是一个挑战,因为 GC 等可能会暂停一些事情。

Quartz 可以为您做很多事情,但在这种情况下,如果您有这些要求,我只会使用自定义 Thread 或 Timer 实现。

【讨论】:

    猜你喜欢
    • 2012-03-28
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多