Quartz SchedulerFactoryBean异常--Spring自动装配惹的祸

Quartz SchedulerFactoryBean异常--Spring自动装配惹的祸 
 
org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist
 
2011-02-12 20:45:02| 分类: Spring | 标签:quartz datasource bean spring property |字号 订阅
Spring的配置文件,启用了自动装配模式:
 
 
 
  
 
 
 
  ...
 
 
则此时会产生如下错误:
 
Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' defined in file [E:\workspace\eis_oracle2\web\WEB-INF\classes\conf\spring\eisSystemScheduleContext.xml]: Invocation of init method failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: table or view does not exist
 
原因:其实这都是Spring的自动装配惹得祸,当存在dataSource的bean,在初始化SchedulerFactoryBean时就自动装配该dataSource属性,此时就启用了jobstore的LocalDataSourceJobStore模式使用数据库来维持状态,quartz的jobstore会从数据库中查询任务。quartz使用数据库进行job状态的维护,但是在数据库中没有找到相应的table,从而无法正常初始化scheduler 。
 
 
 
解决:屏蔽掉自动装配,如下:
 
 
  
 
 
 
另:启用jobstore的RAMJobStore(内存存储的)模式,配置如下:
 
 
  
 
 
  
    org.quartz.simpl.RAMJobStore
  
 
 
 
当设置了dataSource属性,jobStore属性设置将无效,原因是:
 
if (this.dataSource != null) {    
    mergedProps.put(StdSchedulerFactory.PROP_JOB_STORE_CLASS, LocalDataSourceJobStore.class.getName());  
 
详细介绍请参见 SchedulerFactoryBean 方法 setDataSource(DataSource)的javadoc: 
Set the default DataSource to be used by the Scheduler. If set, this will override corresponding settings in Quartz properties. 
 
Note: If this is set, the Quartz settings should not define a job store "dataSource" to avoid meaningless double configuration. 
 
A Spring-specific subclass of Quartz' JobStoreCMT will be used. It is therefore strongly recommended to perform all operations on the Scheduler within Spring-managed (or plain JTA) transactions. Else, database locking will not properly work and might even break (e.g. if trying to obtain a lock on Oracle without a transaction). 
 
Supports both transactional and non-transactional DataSource access. With a non-XA DataSource and local Spring transactions, a single DataSource argument is sufficient. In case of an XA DataSource and global JTA transactions, SchedulerFactoryBean's "nonTransactionalDataSource" property should be set, passing in a non-XA DataSource that will not participate in global transactions.

你可能感兴趣的:(开源框架/组件,Spring,quartz,triggers,transactions,spring,bean,exception)