• 主要配置
    • quartz.scheduler.instanceName
    • quartz.scheduler.instanceId
    • quartz.scheduler.instanceIdGenerator.type
    • quartz.scheduler.threadName
    • quartz.scheduler.makeSchedulerThreadDaemon
    • quartz.scheduler.idleWaitTime
    • quartz.scheduler.dbFailureRetryInterval
    • quartz.scheduler.typeLoadHelper.type
    • quartz.scheduler.jobFactory.type
    • quartz.context.key.SOME_KEY
    • quartz.scheduler.batchTriggerAcquisitionMaxCount
    • quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow
  • 线程池
    • quartz.threadPool.type
    • quartz.threadPool.maxConcurrency
    • Custom ThreadPools
  • 侦听器
  • 插件
    • Sample configuration of Logging Trigger History Plugin
    • Sample configuration of XML Scheduling Data Processor Plugin
    • Sample configuration of Shutdown Hook Plugin
    • Sample configuration of Job Interrupt Monitor Plugin
  • 远程服务器和客户端
    • quartz.scheduler.exporter.type
    • quartz.scheduler.exporter.port
    • quartz.scheduler.exporter.bindName
    • quartz.scheduler.exporter.channelType
    • quartz.scheduler.exporter.channelName
    • quartz.scheduler.exporter.typeFilterLevel
    • quartz.scheduler.exporter.rejectRemoteRequests
  • RAMJobStore
    • quartz.jobStore.misfireThreshold
  • JobStoreTX (ADO.NET)
    • quartz.jobStore.driverDelegateType
    • quartz.jobStore.dataSource
    • quartz.jobStore.tablePrefix
    • quartz.jobStore.useProperties
    • quartz.jobStore.misfireThreshold
    • quartz.jobStore.clustered
    • quartz.jobStore.clusterCheckinInterval
    • quartz.jobStore.maxMisfiresToHandleAtATime
    • quartz.jobStore.selectWithLockSQL
    • quartz.jobStore.txIsolationLevelSerializable
    • quartz.jobStore.acquireTriggersWithinLock
    • quartz.jobStore.lockHandler.type
    • Customizing StdRowLockSemaphore
    • quartz.jobStore.driverDelegateInitString
  • 数据源 (ADO.NET JobStores)
    • quartz.dataSource.NAME.provider
    • quartz.dataSource.NAME.connectionString
    • quartz.dataSource.NAME.connectionStringName
    • quartz.dataSource.NAME.connectionProvider.type
  • 集群

默认情况下,StdSchedulerFactory 从“当前工作目录”加载一个名为 quartz.config 的属性文件。如果失败,则加载 Quartz dll 中的 quartz.config 文件(作为嵌入式资源)。如果您希望使用这些默认值以外的文件,则必须定义系统属性 quartz.properties 以指向您想要的文件。

或者,您可以通过在调用 StdSchedulerFactory 上的 GetScheduler() 之前调用 Initialize(xx) 方法之一来显式初始化工厂。

将按名称创建指定的 IJobStoreIThreadPool 和其他 SPI 类型的实例,然后通过调用等效的属性设置方法在实例上设置配置文件中为它们指定的任何附加属性。例如,如果属性文件包含属性 quartz.jobStore.myProp = 10,那么在实例化 JobStore 类型之后,将在其上调用属性 MyProp 的设置器。在调用属性的 setter 方法之前执行到原始类型(int、long、float、double、boolean 和 string)的类型转换。

一个属性可以通过指定遵循 $@other.property.name 约定的值来引用另一个属性的值,例如,要将调度程序的实例名称引用为其他属性的值,您可以使用 $@quartz.scheduler.instanceName .

提示 您还可以使用基于代码的配置来构建这些密钥。

主要配置

这些属性配置调度程序的标识,以及各种其他“顶级”设置。

属性名称 必需 类型 默认值
quartz.scheduler.instanceName string ‘QuartzScheduler’
quartz.scheduler.instanceId string ‘NON_CLUSTERED’
quartz.scheduler.instanceIdGenerator.type string Quartz.Simpl.SimpleInstanceIdGenerator, Quartz
quartz.scheduler.threadName string 实例名称 + ‘_QuartzSchedulerThread’
quartz.scheduler.makeSchedulerThreadDaemon boolean false
quartz.scheduler.idleWaitTime long 30000
quartz.scheduler.dbFailureRetryInterval long 15000
quartz.scheduler.typeLoadHelper.type string Quartz.Simpl.SimpleTypeLoadHelper
quartz.scheduler.jobFactory.type string Quartz.Simpl.PropertySettingJobFactory
quartz.context.key.SOME_KEY string none
quartz.scheduler.wrapJobExecutionInUserTransaction boolean false
quartz.scheduler.batchTriggerAcquisitionMaxCount int 1
quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow long 0

quartz.scheduler.instanceName

可以是任何字符串,并且该值对调度程序本身没有任何意义 —— 而是作为客户端代码在同一程序中使用多个实例时区分调度程序的一种机制。 如果您使用集群功能,则必须为集群中“逻辑上”相同的调度程序的每个实例使用相同的名称。

quartz.scheduler.instanceId

可以是任何字符串,但对于所有工作的调度程序必须是唯一的,就好像它们是集群内的同一个“逻辑”调度程序一样。 如果您希望为您生成 Id,则可以使用值“AUTO”作为 instanceId。 如果您希望值来自系统属性“quartz.scheduler.instanceId”,则为值“SYS_PROP”。

quartz.scheduler.instanceIdGenerator.type

仅在quartz.scheduler.instanceId 设置为“AUTO”时使用。 默认为“Quartz.Simpl.SimpleInstanceIdGenerator”,它根据主机名和时间戳生成实例 id。 其他 InstanceIdGenerator 实现包括 SystemPropertyInstanceIdGenerator(从系统属性“quartz.scheduler.instanceId”获取实例 id,以及使用本地主机名的 HostnameInstanceIdGenerator (Dns.GetHostEntry(Dns.GetHostName()))。您还可以实现 InstanceIdGenerator 连接你的自我。

quartz.scheduler.threadName

可以是主调度程序线程的有效名称的任何字符串。 如果未指定此属性,线程将接收调度程序的名称(“quartz.scheduler.instanceName”)加上附加的字符串“_QuartzSchedulerThread”。

quartz.scheduler.makeSchedulerThreadDaemon

一个布尔值(“true”或“false”),指定调度程序的主线程是否应该是守护线程。 如果这是您正在使用的线程池实现(很可能是这种情况),另请参阅用于调整 DefaultThreadPoolquartz.scheduler.makeSchedulerThreadDaemon 属性。

quartz.scheduler.idleWaitTime

是当调度程序空闲时,调度程序在重新查询可用触发器之前等待的时间量(以毫秒为单位)。 通常,您不必“调整”此参数,除非您使用的是 XA 事务,并且在延迟触发应立即触发的触发器时遇到问题。 不建议使用小于 5000 毫秒的值,因为它会导致过多的数据库查询。 小于 1000 的值是不合法的。

quartz.scheduler.dbFailureRetryInterval

是调度程序在检测到 JobStore 中的连接丢失(例如与数据库的连接)时将在重试之间等待的时间量(以毫秒为单位)。 在使用 RamJobStore 时,这个参数显然不是很有意义。

quartz.scheduler.typeLoadHelper.type

默认使用最健壮的方法,即使用“Quartz.Simpl.SimpleTypeLoadHelper”类型 - 仅使用 Type.GetType() 加载。

quartz.scheduler.jobFactory.type

要使用的 IJobFactory 的类型名称。 作业工厂负责生成 IJob 实现的实例。 默认值为“Quartz.Simpl.PropertySettingJobFactory”,每次执行即将发生时,它只需调用具有给定类型的 Activator.CreateInstance 以生成一个新实例。 PropertySettingJobFactory 还使用调度程序上下文和作业的内容反射性地设置作业的属性,并触发 JobDataMaps。

quartz.context.key.SOME_KEY

表示将作为字符串放入“调度程序上下文”的 名称-值 对(请参阅 IScheduler.Context)。 例如,设置“quartz.context.key.MyKey = MyValue”将执行等效于 scheduler.Context.Put("MyKey", "MyValue")

quartz.scheduler.batchTriggerAcquisitionMaxCount

允许调度程序节点一次获取(用于触发)的最大触发器数。 默认值为 1。数字越大,触发效率越高(在需要一次触发的触发器非常多的情况下)—— 但代价是集群节点之间的负载可能不平衡。

如果此属性的值设置为 > 1,并且使用了 AdoJobStore,则必须将属性“quartz.jobStore.acquireTriggersWithinLock”设置为“true”以避免数据损坏。

quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow

允许在预定触发时间之前获取和触发触发器的时间量(以毫秒为单位)。 默认为 0。数字越大,触发的批量获取触发器就越有可能一次选择并触发超过 1 个触发器 —— 代价是触发器计划没有被精确遵守(触发器可能会提前触发这个数量 )。

在调度程序有大量触发器需要同时或几乎同时触发的情况下,这可能很有用(出于性能考虑)。

线程池

属性名称 必需 类型 默认值
quartz.threadPool.type string Quartz.Simpl.DefaultThreadPool
quartz.threadPool.maxConcurrency int 10

quartz.threadPool.type

是您希望使用的 ThreadPool 实现的名称。 Quartz 附带的线程池是“Quartz.Simpl.DefaultThreadPool”,应该可以满足几乎所有用户的需求。

它的行为非常简单,并且经过了很好的测试。 它将任务分派到 .NET 任务队列,并确保遵守配置的最大并发任务数量限制。 如果您想在 CLR 级别微调线程池,您应该研究 CLR 的托管线程池

quartz.threadPool.maxConcurrency

这是可以分派到 CLR 线程池的并发任务数。 如果你只有几份作业每天解雇几次,那么 1 个任务就足够了! 如果您有数以万计的作业,每分钟触发许多作业,那么您可能希望最大并发数更像 50 或 100(这在很大程度上取决于您的作业执行的工作的性质以及您的系统资源!)。 还要注意 CLR 线程池配置与 Quartz 本身分开。

自定义线程池

如果您使用自己的线程池实现,您可以通过简单地命名属性来反射地设置属性,如下所示:

在自定义线程池上设置属性

侦听器

全局侦听器可以由 StdSchedulerFactory 实例化和配置,或者您的应用程序可以在运行时自行完成,然后向调度程序注册侦听器。 “全局”侦听器侦听每个作业/触发器的事件,而不仅仅是直接引用它们的作业/触发器。

通过配置文件配置侦听器包括给定一个名称,然后指定类型名称以及要在实例上设置的任何其他属性。 该类型必须有一个无参数的构造函数,并且属性是反射设置的。 仅支持原始数据类型值(包括字符串)。

因此,定义“全局”TriggerListener 的一般模式是:

配置全局 TriggerListener

  1. quartz.triggerListener.NAME.type = MyLibrary.MyListenerType, MyLibrary
  2. quartz.triggerListener.NAME.propName = propValue
  3. quartz.triggerListener.NAME.prop2Name = prop2Value

定义“全局” JobListener 的一般模式是:

配置全局 JobListener

  1. quartz.jobListener.NAME.type = MyLibrary.MyListenerType, MyLibrary
  2. quartz.jobListener.NAME.propName = propValue
  3. quartz.jobListener.NAME.prop2Name = prop2Value

插件

就像侦听器通过配置文件配置插件一样,包括给定一个名称,然后指定类型名称以及要在实例上设置的任何其他属性。 该类型必须有一个无参数的构造函数,并且属性是反射设置的。 仅支持原始数据类型值(包括字符串)。

因此,定义插件的一般模式是:

配置插件

  1. quartz.plugin.NAME.type = MyLibrary.MyPluginType, MyLibrary
  2. quartz.plugin.NAME.propName = propValue
  3. quartz.plugin.NAME.prop2Name = prop2Value

Quartz 附带了几个插件,可以在 Quartz.Plugins 包中找到。 配置其中几个的示例如下:

Logging Trigger History 插件的示例配置

日志触发历史插件捕获触发事件(它也是一个触发侦听器),然后使用日志基础设施进行日志记录。

Logging Trigger History 插件的示例配置

  1. quartz.plugin.triggHistory.type = Quartz.Plugin.History.LoggingTriggerHistoryPlugin, Quartz.Plugins
  2. quartz.plugin.triggHistory.triggerFiredMessage = Trigger {1}.{0} fired job {6}.{5} at: {4:HH:mm:ss MM/dd/yyyy}
  3. quartz.plugin.triggHistory.triggerCompleteMessage = Trigger {1}.{0} completed firing job {6}.{5} at {4:HH:mm:ss MM/dd/yyyy} with resulting trigger instruction code: {9}

XML 调度数据处理器插件的示例配置

作业初始化插件从 XML 文件中读取一组作业和触发器,并在初始化期间将它们添加到调度程序中。 它还可以删除现有数据。

JobInitializationPlugin 的示例配置

  1. quartz.plugin.jobInitializer.type = Quartz.Plugin.Xml.XMLSchedulingDataProcessorPlugin, Quartz.Plugins
  2. quartz.plugin.jobInitializer.fileNames = data/my_job_data.xml
  3. quartz.plugin.jobInitializer.failOnFileNotFound = true

该文件的 XML 模式定义可在 此处 找到。

Shutdown Hook 插件的示例配置

shutdown-hook 插件捕获 CLR 终止的事件,并在调度程序上调用 shutdown。

ShutdownHookPlugin 的示例配置

  1. quartz.plugin.shutdownhook.type = Quartz.Plugin.Management.ShutdownHookPlugin, Quartz.Plugins
  2. quartz.plugin.shutdownhook.cleanShutdown = true


作业中断监视器插件的示例配置

该插件捕获作业长时间运行(超过配置的最大时间)的事件,并告诉调度程序“尝试”在启用时中断它。 插件默认在 5 分钟后发出信号中断,但默认 van 配置为不同的值,配置中的值以毫秒为单位。

JobInterruptMonitorPlugin 的示例配置

  1. quartz.plugin.jobAutoInterrupt.type = Quartz.Plugin.Interrupt.JobInterruptMonitorPlugin, Quartz.Plugins
  2. quartz.plugin.jobAutoInterrupt.defaultMaxRunTime = 3000000

远程服务器和客户端

警告

远程处理仅适用于 .NET Full Framework。 它也被认为是不安全的。

属性名称 必需 类型 默认值
quartz.scheduler.exporter.type string
quartz.scheduler.exporter.port int
quartz.scheduler.exporter.bindName string ‘QuartzScheduler’
quartz.scheduler.exporter.channelType string ‘tcp’
quartz.scheduler.exporter.channelName string ‘http’
quartz.scheduler.exporter.typeFilterLevel string ‘Full’
quartz.scheduler.exporter.rejectRemoteRequests boolean false

如果您希望 Quartz 调度程序通过远程处理将自身导出为服务器,则将 ‘quartz.scheduler.exporter.type’ 设置为 “Quartz.Simpl.RemotingSchedulerExporter, Quartz”。

quartz.scheduler.exporter.type

ISchedulerExporter 的类型,目前仅支持“Quartz.Simpl.RemotingSchedulerExporter, Quartz”。

quartz.scheduler.exporter.port

要监听的端口。

quartz.scheduler.exporter.bindName

绑定到远程基础结构时使用的名称。

quartz.scheduler.exporter.channelType

无论是“tcp”还是“http”,TCP 的性能都更高。

quartz.scheduler.exporter.channelName

绑定到远程基础结构时使用的通道名称。

quartz.scheduler.exporter.typeFilterLevel

Low
.NET Framework 远程处理的低反序列化级别。 它支持与基本远程功能相关的类型

Full
.NET Framework 远程处理的完整反序列化级别。 它支持所有情况下远程支持的所有类型

quartz.scheduler.exporter.rejectRemoteRequests

一个布尔值(true 或 false),指定是否拒绝来自其他计算机的请求。 指定 true 仅允许来自本地计算机的远程调用。

RAMJobStore

RAMJobStore 用于在内存中存储调度信息(作业、触发器和日历)。 RAMJobStore 快速且轻量级,但当进程终止时,所有调度信息都会丢失。

RAMJobStore 是通过设置 quartz.jobStore.type 属性来选择的:

将 Scheduler 的 JobStore 设置为 RAMJobStore

  1. quartz.jobStore.type = Quartz.Simpl.RAMJobStore, Quartz

RAMJobStore 可以使用以下属性进行调整:

属性名称 必需 类型 默认值
quartz.jobStore.misfireThreshold int 60000

quartz.jobStore.misfireThreshold

在被视为“未触发”之前,调度程序将“容忍”触发器通过其下一次触发时间的毫秒数。 默认值(如果您没有在配置中输入此属性)是 60000(60 秒)。

JobStoreTX (ADO.NET)

AdoJobStore 用于在关系数据库中存储调度信息(作业、触发器和日历)。 实际上有两个单独的 AdoJobStore 实现可供您选择,具体取决于您需要的事务行为。

JobStoreTX 通过在每个操作(例如添加作业)之后在数据库连接上调用 Commit()(或 Rollback())来管理所有事务本身。 这是您通常应该使用的作业存储,除非您想集成到某些事务感知框架。

JobStoreTX 是通过设置 quartz.jobStore.type 属性来选择的:

将 Scheduler 的 JobStore 设置为 JobStoreTX

  1. quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX, Quartz

JobStoreTX 可以使用以下属性进行调整:

属性名称 必需 类型 默认值
quartz.jobStore.driverDelegateType string null
quartz.jobStore.dataSource string null
quartz.jobStore.tablePrefix string “QRTZ_”
quartz.jobStore.useProperties boolean false
quartz.jobStore.misfireThreshold int 60000
quartz.jobStore.clustered boolean false
quartz.jobStore.clusterCheckinInterval long 15000
quartz.jobStore.maxMisfiresToHandleAtATime int 20
quartz.jobStore.selectWithLockSQL string “SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE”
quartz.jobStore.txIsolationLevelSerializable boolean false
quartz.jobStore.acquireTriggersWithinLock boolean false (or true - see doc below)
quartz.jobStore.lockHandler.type string null
quartz.jobStore.driverDelegateInitString string null

quartz.jobStore.driverDelegateType

驱动程序代表了解不同数据库系统的特定“方言”。 可能的内置选项包括:

  • Quartz.Impl.AdoJobStore.StdAdoDelegate, Quartz - 没有特定实现时的默认值
  • Quartz.Impl.AdoJobStore.SqlServerDelegate,Quartz - 适用于 Microsoft SQL Server
  • Quartz.Impl.AdoJobStore.PostgreSQLDelegate, Quartz
  • Quartz.Impl.AdoJobStore.OracleDelegate, Quartz
  • Quartz.Impl.AdoJobStore.SQLiteDelegate, Quartz
  • Quartz.Impl.AdoJobStore.MySQLDelegate, Quartz

quartz.jobStore.dataSource

此属性的值必须是配置属性文件中定义的数据源之一的名称。

quartz.jobStore.tablePrefix

AdoJobStore 的 “table prefix” 属性是一个字符串,它等于在你的数据库中创建的 Quartz 表的前缀。 如果 Quartz 使用不同的表前缀,您可以在同一个数据库中拥有多组 Quartz 表。

在 tablePrefix 中包含模式名称

对于支持模式的后备数据库(例如 Microsoft SQL Server),您可以使用 tablePrefix 来包含模式名称。 即对于名为 foo 的模式,前缀可以设置为:

  1. [foo].QRTZ_

注意:任何使用显式模式(例如 dbo)运行的数据库表创建脚本都需要修改以反映此配置。

quartz.jobStore.useProperties

“use properties”标志指示 AdoJobStore JobDataMaps 中的所有值都是字符串,因此可以存储为名称-值对,而不是将更复杂的对象以其序列化形式存储在 BLOB 列中。 这很方便,因为您避免了将非字符串类型序列化为 BLOB 时可能出现的类型版本控制问题。

quartz.jobStore.misfireThreshold

在被视为“未触发”之前,调度程序将“容忍”触发器通过其下一次触发时间的毫秒数。默认值(如果您没有在配置中输入此属性)是 60000(60 秒)。

quartz.jobStore.clustered

设置为“true”以打开聚类功能。如果您有多个 Quartz 实例使用同一组数据库表,则此属性必须设置为“true”……否则您将遇到严重破坏。有关更多信息,请参阅集群的配置文档。

quartz.jobStore.clusterCheckinInterval

设置此实例与集群的其他实例“签入”* 的频率(以毫秒为单位)。影响检测失败实例的速度。

quartz.jobStore.maxMisfiresToHandleAtATime

作业存储在给定通道中将处理的最大未触发触发器数。一次处理许多(超过几十个)可能会导致数据库表被锁定足够长的时间,以至于触发其他(尚未触发的)触发器的性能可能会受到阻碍。

quartz.jobStore.selectWithLockSQL

必须是选择“LOCKS”表中的一行并在该行上放置锁的 SQL 字符串。如果未设置,默认为“SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE”,适用于大多数数据库。 “{0}”在运行时被您在上面配置的 TABLE_PREFIX 替换。 “{1}”替换为调度程序的名称。

quartz.jobStore.txIsolationLevelSerializable

“true”值告诉 Quartz(使用 JobStoreTX 或 CMT 时)设置事务级别以在 ADO.NET 连接上进行序列化。这有助于防止某些数据库在高负载和“持久”事务下发生锁定超时。

quartz.jobStore.acquireTriggersWithinLock

获取下一个要触发的触发器是否应在显式数据库锁内发生。这曾经是必要的(在以前的 Quartz 版本中)以避免特定数据库的死锁,但不再被认为是必要的,因此默认值为“false”。

如果“quartz.scheduler.batchTriggerAcquisitionMaxCount”设置为 > 1,并且使用了 AdoJobStore,则必须将此属性设置为“true”以避免数据损坏(从 Quartz 2 开始,如果设置了 batchTriggerAcquisitionMaxCount,则默认为“true”> 1)。

quartz.jobStore.lockHandler.type

用于生成 Quartz.Impl.AdoJobStore.ISemaphore 实例的类型名称,用于锁定对作业存储数据的控制。这是一项高级配置功能,大多数用户不应该使用它。

默认情况下,Quartz 会选择最合适的(预先捆绑的)信号量实现来使用。

自定义 StdRowLockSemaphore

如果您明确选择使用此 DB Semaphore,则可以进一步自定义轮询 DB 锁的频率。

使用自定义 StdRowLockSemaphore 实现的示例

  1. quartz.jobStore.lockHandler.type = Quartz.Impl.AdoJobStore.StdRowLockSemaphore
  2. quartz.jobStore.lockHandler.maxRetry = 7 # Default is 3
  3. quartz.jobStore.lockHandler.retryPeriod = 3000 # Default is 1000 millis

quartz.jobStore.driverDelegateInitString

可以在初始化期间传递给 DriverDelegate 的以竖线分隔的属性(及其值)列表。

字符串的格式如下:

设置名称=设置值|其他设置名称=其他设置值|...

StdAdoDelegate 及其所有后代(Quartz 附带的所有委托)都支持一个名为“triggerPersistenceDelegateTypes”的属性,该属性可以设置为实现 ITriggerPersistenceDelegate 接口以存储自定义触发器类型的以逗号分隔的类型列表。 有关为自定义触发器编写持久性委托的示例,请参阅实现 SimplePropertiesTriggerPersistenceDelegateSupportSimplePropertiesTriggerPersistenceDelegateSupport

数据源 (ADO.NET JobStores)

如果您使用的是 AdoJobstore,则需要一个 DataSource 来使用它(或两个 DataSource,如果您使用的是 JobStoreCMT)。

您定义的每个 DataSource(通常是一个或两个)都必须指定一个名称,并且您为每个定义的属性必须包含该名称,如下所示。 DataSource 的“NAME”可以是任何你想要的,除了在分配给 AdoJobStore 时能够识别它之外没有任何意义。

Quartz 创建的数据源定义了以下属性:

属性名称 必需 类型 默认值
quartz.dataSource.NAME.provider string
quartz.dataSource.NAME.connectionString string
quartz.dataSource.NAME.connectionStringName string
quartz.dataSource.NAME.connectionProvider.type string

quartz.dataSource.NAME.provider

目前支持以下数据库提供程序:

  • SqlServer - 微软 SQL 服务器
  • OracleODP - Oracle 的 Oracle 驱动程序
  • OracleODPManaged - 适用于 Oracle 11 的 Oracle 托管驱动程序
  • MySql - MySQL 连接器/.NET
  • SQLite - SQLite ADO.NET 提供程序
  • SQLite-Microsoft - Microsoft SQLite ADO.NET 提供程序
  • Firebird - Firebird ADO.NET 提供程序
  • Npgsql - PostgreSQL Npgsql

quartz.dataSource.NAME.connectionString

要使用的 ADO.NET 连接字符串。 如果您在下面使用 connectionStringName,则可以跳过此步骤。

quartz.dataSource.NAME.connectionStringName

要使用的连接字符串名称。 在 app.config 或 appsettings.json 中定义。

quartz.dataSource.NAME.connectionProvider.type

允许您定义实现 IDbProvider 接口的自定义连接提供程序。

Quartz 定义的数据源示例

  1. quartz.dataSource.myDS.provider = SqlServer
  2. quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartznet;User Id=quartznet;Password=quartznet;

集群

Quartz 的集群功能通过故障转移和负载平衡功能为您的调度程序带来高可用性和可扩展性。

集群目前仅适用于 AdoJobstore(JobStoreTXJobStoreCMT),并且基本上通过让集群的每个节点共享相同的数据库来工作。

负载平衡会自动发生,集群的每个节点都会尽快触发作业。当触发器的触发时间发生时,第一个获取它的节点(通过对其加锁)就是触发它的节点。

每次触发时只有一个节点会触发作业。我的意思是,如果作业有一个重复触发器,告诉它每 10 秒触发一次,那么在 12:00:00 恰好一个节点将运行该作业,而在 12:00:10 恰好一个节点将运行作业等。它不一定每次都是同一个节点 - 哪个节点运行它或多或少是随机的。负载平衡机制对于繁忙的调度程序(很多触发器)是近乎随机的,但对于非繁忙(例如,很少触发器)调度程序有利于相同的节点。

当其中一个节点在执行一项或多项作业期间发生故障时,就会发生故障转移。当一个节点发生故障时,其他节点会检测该状况并识别数据库中故障节点中正在进行的作业。任何标记为恢复的作业(在 JobDetail 上具有“requests recovery”属性)将由其余节点重新执行。未标记为恢复的作业将在下次触发相关触发器时被释放以供执行。

集群功能最适合扩展长时间运行和/或 CPU 密集型作业(将工作负载分配到多个节点)。如果您需要向外扩展以支持数千个短期运行(例如 1 秒)的作业,请考虑使用多个不同的调度程序(包括用于 HA 的多个集群调度程序)对作业集进行分区。调度程序使用集群范围的锁,这种模式会随着您添加更多节点而降低性能(当超过大约三个节点时 - 取决于您的数据库的功能等)。

通过将 quartz.jobStore.clustered 属性设置为“true”来启用集群。集群中的每个实例都应使用 quartz.properties 文件的相同副本。例外情况是使用相同的属性文件,但允许的例外情况如下:线程池大小不同,quartz.scheduler.instanceId 属性的值不同。集群中的每个节点都必须有一个唯一的 instanceId,这很容易通过将“AUTO”设置为该属性的值来完成(不需要不同的属性文件)。有关详细信息,请参阅有关 AdoJobStore 的配置属性的信息。

警告

永远不要在单独的机器上运行集群,除非它们的时钟使用某种形式的时间同步服务(守护程序)进行同步,这种服务非常有规律地运行(时钟必须在一秒内)。 如果您不熟悉如何执行此操作,请参阅 https://www.nist.gov/pml/time-and-frequency-division/services/internet-time-service-its

警告

永远不要针对任何其他实例正在运行 (Start()ed) 的同一组数据库表启动 (scheduler.Start()) 非集群实例。 您可能会遇到严重的数据损坏,并且肯定会遇到不稳定的行为。

警告

监控并确保您的节点有足够的 CPU 资源来完成作业。 当某些节点处于 100% CPU 时,它们可能无法更新作业存储,而其他节点可以认为这些作业丢失并通过重新运行来恢复它们。

集群调度程序的示例属性

  1. #============================================================================
  2. # Configure Main Scheduler Properties
  3. #============================================================================
  4. quartz.scheduler.instanceName = MyClusteredScheduler
  5. quartz.scheduler.instanceId = AUTO
  6. #============================================================================
  7. # Configure ThreadPool
  8. #============================================================================
  9. quartz.threadPool.type = Quartz.Simpl.DefaultThreadPool, Quartz
  10. quartz.threadPool.threadCount = 25
  11. quartz.threadPool.threadPriority = 5
  12. #============================================================================
  13. # Configure JobStore
  14. #============================================================================
  15. quartz.jobStore.misfireThreshold = 60000
  16. quartz.jobStore.type = Quartz.Impl.AdoJobStore.JobStoreTX
  17. quartz.jobStore.driverDelegateType = Quartz.Impl.AdoJobStore.SqlServerDelegate
  18. quartz.jobStore.useProperties = true
  19. quartz.jobStore.dataSource = myDS
  20. quartz.jobStore.tablePrefix = QRTZ_
  21. quartz.jobStore.clustered = true
  22. quartz.jobStore.clusterCheckinInterval = 20000
  23. #============================================================================
  24. # Configure Datasources
  25. #============================================================================
  26. quartz.dataSource.myDS.provider = SqlServer
  27. quartz.dataSource.myDS.connectionString = Server=localhost;Database=quartznet;User Id=quartznet;Password=quartznet;