我有一个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
答案 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个作业。在“串行模式”下运行。