如何确保Quartz.NET中一次只能触发一个作业?

时间:2014-03-10 16:57:47

标签: quartz-scheduler quartz.net

我有一个Windows服务,它使用Quartz.NET来执行计划的作业。我只想让它一次拿起一份工作。但是,偶尔我会看到行为表明它已经同时获得了两份工作。

有两个日志文件(常规文件和一个日常文件在使用常规文件时自动生成),其中的作业在同一时间开始。我可以看到两个作业都在QRTZ_FIRED_TRIGGERS表中执行,但只有一个具有正确的实例ID,这是奇数。

我已将Quartz配置为仅使用单个线程。这不是你怎么告诉它一次只能找一份工作吗?

这是我的quartz.config文件,其中包含敏感值:

quartz.scheduler.instanceName = DefaultQuartzJobScheduler
quartz.scheduler.instanceId = ######################
quartz.jobstore.clustered = true
quartz.jobstore.clusterCheckinInterval = 15000

quartz.threadPool.type = Quartz.Simpl.SimpleThreadPool, Quartz
quartz.jobStore.useProperties = false
quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz
quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.OracleDelegate, Quartz
quartz.jobStore.tablePrefix = QRTZ_
quartz.jobStore.lockHandler.type = Quartz.Impl.AdoJobStore.UpdateLockRowSemaphore, Quartz
quartz.jobStore.misfireThreshold = 60000
quartz.jobStore.dataSource = default
quartz.dataSource.default.connectionString = ######################
quartz.dataSource.default.provider = OracleClient-20

#  Customizable values per Node 
quartz.threadPool.threadCount = 1
quartz.threadPool.threadPriority = Normal

1 个答案:

答案 0 :(得分:1)

使threadcount = 1。

<add key="quartz.threadPool.threadCount" value="1"/>
<add key="quartz.threadPool.threadPriority" value="Normal"/>

(正如你所做的那样)

让你的每个职位“有状态”

[PersistJobDataAfterExecution]
[DisallowConcurrentExecution]
public class StatefulDoesNotRunConcurrentlyJob : IJob        /* : IStatefulJob */ /* Error  43  'Quartz.IStatefulJob' is obsolete: 'Use DisallowConcurrentExecutionAttribute and/or PersistJobDataAfterExecutionAttribute annotations instead. */
{
}

我已经离开了~~较旧的~~版本如何执行此操作(即“IStatefulJob”)以及编写过时的“IStatefulJob”界面时生成的错误消息。但错误消息给出了提示。

基本上,如果你有1个线程并且每个作业都标有“DisallowConcurrentExecution”,那么它应该在任何给定时间产生1个作业。在“串行模式”下运行。