【问题标题】:Start quartz.net jobs more frequently更频繁地启动quartz.net 工作
【发布时间】:2015-08-19 13:11:46
【问题描述】:

我们正在使用 Quartz.net 并且需要更频繁地触发这些作业。 作业设置为在 3 秒内触发,但通常需要 15-30 秒才能运行。

我也试过(没有结果)

感谢您的任何帮助。如果重要的话,我们会使用 2.1.2.400

我们的配置

  <quartz>
    <add key="quartz.scheduler.instanceName" value="ServerScheduler" />
    <add key="quartz.scheduler.instanceId" value="AUTO" />
    <add key="quartz.threadPool.type" value="Quartz.Simpl.SimpleThreadPool, Quartz" />
    <add key="quartz.threadPool.threadCount" value="10" />
    <add key="quartz.threadPool.threadPriority" value="2" />
    <add key="quartz.jobStore.misfireThreshold" value="60000" />
    <add key="quartz.jobStore.clusterCheckinInterval" value="1000" />
    <add key="quartz.jobStore.type" value="Quartz.Impl.AdoJobStore.JobStoreTX, Quartz" />
    <add key="quartz.jobStore.useProperties" value="false" />
    <add key="quartz.jobStore.dataSource" value="default" />
    <add key="quartz.jobStore.tablePrefix" value="QRTZ_" />
    <add key="quartz.jobStore.clustered" value="true" />
    <add key="quartz.jobStore.lockHandler.type" value="Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz" />
    <add key="quartz.dataSource.default.connectionString" value="Data Source=xyz..." />
    <add key="quartz.dataSource.default.connectionStringName" value="RecDB" />
    <add key="quartz.dataSource.default.provider" value="SqlServer-20" />
  </quartz>

代码

var jobSilentDetail = CreateFutureJobDetail(new JobKey(JobName(shoppingListNotification.Id)),
                                                typeof(JobShoppinglistNotification),
                                                string.Format("Job bla bla"));

jobSilentDetail.JobDataMap["ShoppingListNotification"] = shoppingListNotification;

var startJobAt = DateTime.Now.AddSeconds(3);
SaveFutureJob(jobSilentDetail, startJobAt);




protected void SaveImmediateJob(IJobDetail jobDetail)
{
    Scheduler.ScheduleJob(jobDetail, CreateImmediateTriggerFor(jobDetail));
}

protected void SaveFutureJob(IJobDetail jobDetail, DateTime startTime)
{
    Scheduler.ScheduleJob(jobDetail, CreateFutureTriggerFor(jobDetail, startTime.ToUniversalTime()));
}


protected ITrigger CreateImmediateTriggerFor(IJobDetail jobDetail)
{
    return CreateOneRunTriggerFor(jobDetail, QuartzJobType.Immediate, DateTime.Now);
}

protected ITrigger CreateFutureTriggerFor(IJobDetail jobdetail, DateTime startTime)
{
    return CreateOneRunTriggerFor(jobdetail, QuartzJobType.Future, startTime);
}


private static ITrigger CreateOneRunTriggerFor(IJobDetail jobDetail, QuartzJobType quartzJobType, DateTime startTime)
{
    var trigger = TriggerBuilder
    .Create()
    .WithIdentity(jobDetail.Key.Name, quartzJobType.ToString())
    .WithSimpleSchedule()
    .StartAt(startTime.ToUniversalTime())
    .Build();

    return trigger;
}

【问题讨论】:

  • 您能提供其余的配置值吗?特别是 threadpool.threadcount 和 Threadpriority
  • 在我上面的问题中添加了配置。用 xyz 替换了 db 连接字符串...虽然
  • 我有类似的配置,但我使用 SimpleSemaphore 作为锁处理程序:Quartz.Impl.AdoJobStore.SimpleSemaphore,Quartz。这是我看到的唯一区别。
  • Alioza,你需要多长时间才能解雇一份工作?我的需要 20-30 秒才能运行。我希望它在 3 秒内运行。
  • 通常只需要几秒钟,大多数情况下是立即的。它还取决于系统的负载,如果您有其他繁重的处理也会延迟您的触发器。

标签: c# quartz.net quartz.net-2.0


【解决方案1】:

我强烈建议您试用最新版本,就像您在 cmets 中提到的那样。在某些情况下,AdoJobStore 作业处理存在一个错误,该错误在 2.2.3 版中已修复。也请不要在升级到 >= 2.2 系列时需要(次要)数据库架构升级。

您可以看到release history in here

如果您遇到问题,建议您查看后续版本的发行说明。

【讨论】:

  • Marko Lahma 感谢您的回复。是的,升级总是有益的。我不确定升级是否会有所帮助,或者quartz.net 不适合临时通知的工作(所以这是预期的行为)。
  • 我们现在已经升级到 Quartz.net 的最新版本。 15-20秒快一点。但还是要慢。 会有什么不同还是我们需要破解这个项目?在 JobStoreSupport.cs 我看到了这个: ClusterCheckinInterval = TimeSpan.FromMilliseconds(7500);还是 ClusterCheckinInterval 与 Quartz 检查新作业的频率无关?
【解决方案2】:

好吧,我们从来没有让 Quartz.net 的启动速度足够快。花了大约 15 秒而不是所需的 3 秒。所以我们完全改变了方法。

而不是许多未来的作业应该在创建后 3 秒运行。我们创建了一个每 2 秒触发一次的重复作业,并编写逻辑(使用不同的数据库表)来确定哪些项目已经过了 3 秒的等待时间。

希望这可以帮助遇到同样问题的其他人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多