9

我们有一个应用程序使用 Quartz 来安排一些工作。它使用 JDBCJobstore 来持久化与作业相关的元数据。

迄今为止,它一直在使用在quartz.properties 中定义的数据源。但根据即将到来的要求,我们计划从quartz.properties 中移出数据源,并将其作为SchedulerFactoryBean 数据源属性的一部分提供。

 org.springframework.scheduling.quartz.SchedulerFactoryBean

根据 SchedulerFactoryBean文档

使用持久作业时,强烈建议在 Spring 管理(或纯 JTA)事务中对调度程序执行所有操作。否则,数据库锁定将无法正常工作,甚至可能中断

它的数据源属性文档说:

因此强烈建议在 Spring 管理的(或纯 JTA)事务中对调度程序执行所有操作。否则,数据库锁定将无法正常工作,甚至可能中断

好吧,就我而言,它正在崩溃。文档中“在 Spring 管理的(或纯 JTA)事务中对调度程序执行所有操作”的确切含义是什么。

我们提供的数据源没有在其他任何地方使用。Quartz.properties 看起来像这样:

org.quartz.scheduler.instanceName = JobScheduler
org.quartz.scheduler.instanceId = pcmlScheduler

org.quartz.plugin.shutdownHook.class=org.quartz.plugins.management.ShutdownHookPlugin
org.quartz.plugin.shutdownHook.cleanShutdown = true

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
org.quartz.threadPool.threadCount =  2
org.quartz.threadPool.threadPriority = 4

org.quartz.jobStore.misfireThreshold = 5000
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
org.quartz.jobStore.tablePrefix = QRTZ_

如果我能得到一个上下文究竟是什么事务是指我可以进一步归零数据库锁BreaK:

 Failure obtaining db row lock: No row exists in table QRTZ_LOCKS for lock named: TRIGGER_ACCESS [See nested exception: java.sql.SQLException: No row exists in table QRTZ_LOCKS for lock named: TRIGGER_ACCESS]

确实 QRTZ_LOCKS 没有任何行,但管理它应该是石英头痛。它管理得很好,当在quartz.properties 中提供数据源时工作得很好。

更新:从石英论坛,得到了这个问题的副本,根据建议,在 QRTZ_LOCKS 中添加以下行可以解决问题。

INSERT INTO QRTZ_LOCKS values('TRIGGER_ACCESS');
INSERT INTO QRTZ_LOCKS values('JOB_ACCESS');
INSERT INTO QRTZ_LOCKS values('CALENDAR_ACCESS');
INSERT INTO QRTZ_LOCKS values('STATE_ACCESS');
INSERT INTO QRTZ_LOCKS values('MISFIRE_ACCESS'); 

我不知道这有多可靠,但它确实有效。有趣的观察是,当提供数据源作为 quary.properties 的一部分时,它并不期望这些行。但是作为部分 schedulerFactoryBean 提供数据源,它需要这些(可能)。理想情况下,即使需要它,它也应该由石英本身来照顾。

需要石英内部人员/用户的一些专家评论。

4

0 回答 0