codecamp

Quartz配置JDBC-JobStoreCMT

配置JDBC-JobStoreCMT

JDBCJobStore用于在关系数据库中存储调度信息(Jobs,Triggers和calendars)。实际上,您可以选择两个独立的JDBCJobStore类,具体取决于您需要的事务性行为。

JobStoreCMT依赖于正在使用Quartz的应用程序管理的事务。在尝试安排(或取消调度)jobs/Triggers之前,JTA事务必须进行中。这使得调度的“工作”成为应用程序“较大”事务的一部分。JobStoreCMT实际上需要使用两个数据源,一个是由应用程序服务器(通过JTA)管理的连接的事务,另一个数据源具有不参与全局(JTA)事务的连接。当应用程序使用JTA事务(例如通过EJB会话Bean)来执行其工作时,JobStoreCMT是适当的。

通过设置“org.quartz.jobStore.class”属性来选择JobStore:

将计划程序的JobStore设置为JobStoreCMT

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreCMT

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

Property NameRequiredTypeDefault Value
org.quartz.jobStore.driverDelegateClassyesstringnull
org.quartz.jobStore.dataSourceyesstringnull
org.quartz.jobStore.nonManagedTXDataSourceyesstringnull
org.quartz.jobStore.tablePrefixnostring"QRTZ_"
org.quartz.jobStore.usePropertiesnobooleanfalse
org.quartz.jobStore.misfireThresholdnoint60000
org.quartz.jobStore.isClusterednobooleanfalse
org.quartz.jobStore.clusterCheckinIntervalnolong15000
org.quartz.jobStore.maxMisfiresToHandleAtATimenoint20
org.quartz.jobStore.dontSetAutoCommitFalsenobooleanfalse
org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalsenobooleanfalse
org.quartz.jobStore.selectWithLockSQLnostring"SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE"
org.quartz.jobStore.txIsolationLevelSerializablenobooleanfalse
org.quartz.jobStore.txIsolationLevelReadCommittednobooleanfalse
org.quartz.jobStore.acquireTriggersWithinLocknobooleanfalse (or true - see doc below)
org.quartz.jobStore.lockHandler.classnostringnull
org.quartz.jobStore.driverDelegateInitStringnostringnull

org.quartz.jobStore.driverDelegateClass

Driver delegates 了解不同数据库系统的特定“dialects”。可能的选择包括:

  • org.quartz.impl.jdbcjobstore.StdJDBCDelegate(用于完全符合JDBC的驱动程序)
  • org.quartz.impl.jdbcjobstore.MSSQLDelegate(对于Microsoft SQL Server和Sybase)
  • org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
  • org.quartz.impl.jdbcjobstore.WebLogicDelegate(对于WebLogic驱动程序)
  • org.quartz.impl.jdbcjobstore.oracle.OracleDelegate
  • org.quartz.impl.jdbcjobstore.oracle.WebLogicOracleDelegate(对于Weblogic中使用的Oracle驱动程序)
  • org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate(对于在Weblogic中使用的Oracle驱动程序)
  • org.quartz.impl.jdbcjobstore.CloudscapeDelegate
  • org.quartz.impl.jdbcjobstore.DB2v6Delegate
  • org.quartz.impl.jdbcjobstore.DB2v7Delegate
  • org.quartz.impl.jdbcjobstore.DB2v8Delegate
  • org.quartz.impl.jdbcjobstore.HSQLDBDelegate
  • org.quartz.impl.jdbcjobstore.PointbaseDelegate
  • org.quartz.impl.jdbcjobstore.SybaseDelegate

请注意,许多数据库已知与StdJDBCDelegate一起工作,而其他数据库与其他数据库的代理人合作,例如Derby与Cloudscape代理(不出意外)工作良好。

org.quartz.jobStore.dataSource

此属性的值必须是配置属性文件中定义的DataSource的名称。对于JobStoreCMT,需要该DataSource包含能够参与JTA(例如容器管理的)事务的连接。这通常意味着DataSource将在应用程序服务器内部进行配置和维护,Quartz将通过JNDI获得一个句柄。有关更多信息,请参阅DataSources配置文档

org.quartz.jobStore.nonManagedTXDataSource

JobStoreCMT 需要一个(第二个)数据源,其中包含不会是容器管理事务的一部分的连接。此属性的值必须是配置属性文件中定义的DataSource的名称。此数据源必须包含非CMT连接,或换句话说,Quartz直接调用commit()和rollback()的合法连接。

org.quartz.jobStore.tablePrefix

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

org.quartz.jobStore.useProperties

“使用属性”标志指示JDBCJobStore,JobDataMaps中的所有值都将是“字符串”,因此可以将其存储为名称 - 值对,而不是以BLOB列的序列化形式存储更复杂的对象。这可以方便,因为您避免了将非String类序列化为BLOB时可能产生的类版本控制问题。

org.quartz.jobStore.misfireThreshold

在被认为“misfired”之前,调度程序将“tolerate”一个Triggers将其下一个启动时间通过的毫秒数。默认值(如果您在配置中未输入此属性)为60000(60秒)。

org.quartz.jobStore.isClustered

设置为“true”以打开群集功能。如果您有多个Quartz实例使用同一组数据库表,则此属性必须设置为“true”,否则您将遇到破坏。

org.quartz.jobStore.clusterCheckinInterval

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

org.quartz.jobStore.maxMisfiresToHandleAtATime

在给定的通行证中,工作区将处理的最大错误次数触发。一次处理很多(超过几十打)可能导致数据库表被锁定得足够长,以致可能会阻碍其他(未失败的)Triggers触发的性能。

org.quartz.jobStore.dontSetAutoCommitFalse

将此参数设置为“true”可以告诉Quartz 在从DataSource获取的连接上不调用setAutoCommit(false)。这在一些情况下可能会有所帮助,例如,如果您有一个驱动程序,如果它已经关闭时被调用,则会抱怨。此属性默认为false,因为大多数驱动程序要求调用setAutoCommit(false)。

org.quartz.jobStore.dontSetNonManagedTXConnectionAutoCommitFalse

与属性org.quartz.jobStore.dontSetAutoCommitFalse相同,但它适用于非ManagedTXDataSource。

org.quartz.jobStore.selectWithLockSQL

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

org.quartz.jobStore.txIsolationLevelSerializable

值“true”告诉Quartz 在JDBC连接上调用setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE)。这可以有助于防止在高负载下的某些数据库的锁定超时以及“持久”事务。

org.quartz.jobStore.txIsolationLevelReadCommitted

当设置为“true”时,此属性告诉Quartz 在非托管JDBC连接上调用setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED)。这有助于防止在高负载下的某些数据库(如DB2)和“持久”事务的锁超时。

org.quartz.jobStore.acquireTriggersWithinLock

是否在明确的数据库锁中发生触发下一个Triggers的触发。这曾经是必需的(在以前的Quartz版本中),以避免与特定数据库的死锁,但不再需要,因此默认值为“false”。

如果“org.quartz.scheduler.batchTriggerAcquisitionMaxCount”设置为> 1,并使用JDBC JobStore,则此属性必须设置为“true”以避免数据损坏(从Quartz 2.1.1开始,“true”现在是默认值如果batchTriggerAcquisitionMaxCount设置为> 1)。

org.quartz.jobStore.lockHandler.class

用于生成用于锁定作业存储数据控件的org.quartz.impl.jdbcjobstore.Semaphore实例的类名称。这是一个高级配置功能,大多数用户不应该使用它。默认情况下,Quartz将选择最适合(预捆绑)的Semaphore实现来使用。“org.quartz.impl.jdbcjobstore.UpdateLockRowSemaphore” QUARTZ-497可能对MS SQL Server用户很感兴趣。与Quartz捆绑在一起的“JTANonClusteredSemaphore”可以在使用JobStoreCMT时提高性能,尽管它是一个实验性实现。参见QUARTZ-441QUARTZ-442

org.quartz.jobStore.driverDelegateInitString

一个以管道分隔的属性列表(及其值),可以在初始化时间内传递给DriverDelegate。

字符串的格式是这样的:

“settingName = settingValue | otherSettingName = otherSettingValue | ...”

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


Quartz配置JDBC-JobStoreTX
Quartz配置DataSources
温馨提示
下载编程狮App,免费阅读超1000+编程语言教程
取消
确定
目录

关闭

MIP.setData({ 'pageTheme' : getCookie('pageTheme') || {'day':true, 'night':false}, 'pageFontSize' : getCookie('pageFontSize') || 20 }); MIP.watch('pageTheme', function(newValue){ setCookie('pageTheme', JSON.stringify(newValue)) }); MIP.watch('pageFontSize', function(newValue){ setCookie('pageFontSize', newValue) }); function setCookie(name, value){ var days = 1; var exp = new Date(); exp.setTime(exp.getTime() + days*24*60*60*1000); document.cookie = name + '=' + value + ';expires=' + exp.toUTCString(); } function getCookie(name){ var reg = new RegExp('(^| )' + name + '=([^;]*)(;|$)'); return document.cookie.match(reg) ? JSON.parse(document.cookie.match(reg)[2]) : null; }