更频繁地开始 quartz.net 个工作
Start quartz.net jobs more frequently
我们正在使用 Quartz.net 并且需要更频繁地触发工作。
作业设置为在 3 秒内触发,但通常需要 15-30 秒才能达到 运行。
我也试过了(没结果)
< 添加键="quartz.jobStore.clusterCheckinInterval" 值="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;
}
我强烈建议试用您在评论中提到的最新版本。在某些情况下,AdoJobStore 作业处理存在一个错误,该错误在 2.2.3 版中已修复。还请注意,当升级到 >= 2.2 系列时,需要(次要)数据库架构升级。
您可以看到release history in here。
如果您遇到问题,始终建议您查看后续版本的发行说明。
好吧,我们从来没有 Quartz.net 开火足够快。花了大约 15 秒而不是所需的 3 秒。所以我们完全改变了方法。
而不是许多未来的工作应该在创建后 运行 3 秒。我们创建了一个每 2 秒触发一次的循环作业,并编写逻辑(使用不同的数据库 table)来确定哪些项目已经过了 3 秒的等待时间。
希望这可以帮助遇到同样问题的其他人。
我们正在使用 Quartz.net 并且需要更频繁地触发工作。 作业设置为在 3 秒内触发,但通常需要 15-30 秒才能达到 运行。
我也试过了(没结果) < 添加键="quartz.jobStore.clusterCheckinInterval" 值="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;
}
我强烈建议试用您在评论中提到的最新版本。在某些情况下,AdoJobStore 作业处理存在一个错误,该错误在 2.2.3 版中已修复。还请注意,当升级到 >= 2.2 系列时,需要(次要)数据库架构升级。
您可以看到release history in here。
如果您遇到问题,始终建议您查看后续版本的发行说明。
好吧,我们从来没有 Quartz.net 开火足够快。花了大约 15 秒而不是所需的 3 秒。所以我们完全改变了方法。
而不是许多未来的工作应该在创建后 运行 3 秒。我们创建了一个每 2 秒触发一次的循环作业,并编写逻辑(使用不同的数据库 table)来确定哪些项目已经过了 3 秒的等待时间。
希望这可以帮助遇到同样问题的其他人。