【问题标题】:How to ensure only one job fires at a time in Quartz.NET?如何确保在 Quartz.NET 中一次只触发一项工作?
【发布时间】:2014-03-10 16:57:46
【问题描述】:

我有一个使用 Quartz.NET 执行计划作业的 Windows 服务。我只希望它一次接一份工作。但是,有时我会看到表明它同时获得了两个工作的行为。

有两个日志文件(一个常规文件和一个在使用常规文件时自动生成),其中的作业在完全相同的时间开始。我可以在 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

【问题讨论】:

    标签: quartz-scheduler quartz.net


    【解决方案1】:

    使线程数 = 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. */
    {
    }
    

    我留下了 ~~older~~ 版本的名称(即“IStatefulJob”)以及当您对过时的“IStatefulJob”接口进行编码时生成的错误消息。但是错误信息给出了提示。

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

    【讨论】:

    • 我使用的是旧版本的 Quartz,所以我尝试了 IStatefulJob 方法,但它允许执行多个作业。似乎在 Quartz 中,工作和工作类型之间存在区别。这些都是相同的工作类型,但不同的工作。如果可以保证串行执行,我愿意升级到更新版本的 Quartz 以使用 DisallowConcurrentExecution 属性...
    • 我做了一次 POC,并展示了在一个线程上运行的单个作业。我建议在批发升级之前用新版本做一个小的概念证明。但我认为 IStatefulJob 存在某种问题......因为它们从接口更改为 [Attribute]。我的简单工作在 .temp 目录中弹出了一个文本文件。
    • 谢谢,这就是我现在正在做的事情。当我有结果时会发布一些东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-18
    • 2012-01-05
    • 1970-01-01
    • 2010-10-05
    相关资源
    最近更新 更多