更频繁地启动quartz.net作业

时间:2015-08-19 13:11:47

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

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

我也尝试过(没有结果) < add key =“quartz.jobStore.clusterCheckinInterval”value =“1000”/>

感谢PS的帮助。如果重要,我们正在使用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;
}

2 个答案:

答案 0 :(得分:0)

我强烈建议你试试最新版本,就像你在评论中提到的那样。在某些情况下,AdoJobStore作业处理存在一些错误,在2.2.3版本中已修复。另请注意,升级到&gt; = 2.2系列时,需要进行(次要)数据库模式升级。

您可以看到release history in here

如果您遇到问题,请务必查看以后发布的发行说明。

答案 1 :(得分:0)

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

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

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