我在使用 QUARTZ (2.1.3) 在 Spring (3.1.1) 下将触发器保存到 MySQL 时遇到问题。经过一番调试,我想出了如下流程:
- ScheduleFactoryBean.afterPropertiesSet 在启动时调用 registerJobsAndTriggers
- this.transactionManager.getTransaction(new DefaultTransactionDefinition())
- DataSourceUtils.doGetConnection(dataSource); (在 LocalDataSourceJobStore 类中)
- 使用步骤 3 中的连接插入触发器和作业详细信息
- DataSourceUtils.releaseConnection(con, this.dataSource); (在 LocalDataSourceJobStore 中)
- this.transactionManager.commit(transactionStatus) (从第 1 步开始)
- commit() 调用 triggerBeforeCompletion(在 AbstractPlatFormTransactionManager 中)
- triggerBeforeCompletion 最终调用 connection.close() 因为 referenceCount(在 ConnectionHolder 中)为零(由 releaseConnection 从 1 更改为 0)。
- connection.close 触发 ROLLBACK,如 MySQL 端的日志所示。
这是我的配置信息:
<bean id="dataSource.dbcp" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">...</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">...</bean>
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="startupDelay" value="15" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="schedulerName" value="mySched" />
<property name="jobFactory" ref="springBeanJobFactory" />
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="triggers">
<list>
<ref bean="dummyTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.scheduler.instanceId">AUTO</prop>
<prop key="org.quartz.threadPool.threadCount">5</prop>
<prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
</props>
</property>
</bean>
<bean id="dummyTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">...</bean>
我已经尝试了基于 QUARTZ/Spring/This site 研究的各种配置更改,但并未将触发器保存在 QRTZ 表中。
提前致谢。