<property name="targetObject"><ref bean="DistServiceCommon"/></property>
<property name="targetMethod"><value>getDists</value></property>
</bean>
<bean id="LoadDistsTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail"><ref bean="LoadDists"/></property>
<property name="cronExpression"><value>0 2 08-21 * * ?</value></property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list><ref local="LoadDistsTrigger"/></list>
</property>
</bean>
但在系统启动时,报以下错误:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean' defined in class path resource [springconfig/applicationContext-loadjob.xml]: Initialization of bean failed; nested exception is org.quartz.SchedulerConfigException: Failure occured during job recovery.
org.quartz.SchedulerConfigException: Failure occured during job recovery. [See nested exception: org.quartz.impl.jdbcjobstore.LockException: Failure obtaining db row lock: ORA-00942: 表或视图不存在
[See nested exception: java.sql.SQLException: ORA-00942: 表或视图不存在
]]
at org.quartz.impl.jdbcjobstore.JobStoreSupport.initialize(JobStoreSupport.java:504)
at org.quartz.impl.jdbcjobstore.JobStoreCMT.initialize(JobStoreCMT.java:150)
at org.springframework.scheduling.quartz.LocalDataSourceJobStore.initialize(LocalDataSourceJobStore.java:131)
at org.quartz.impl.StdSchedulerFactory.instantiate(StdSchedulerFactory.java:888)
at org.quartz.impl.StdSchedulerFactory.getScheduler(StdSchedulerFactory.java:1020)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.createScheduler(SchedulerFactoryBean.java:599)
at org.springframework.scheduling.quartz.SchedulerFactoryBean.afterPropertiesSet(SchedulerFactoryBean.java:508)
<bean name="quartzScheduler"
class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.class">
org.quartz.simpl.RAMJobStore
</prop>
</props>
</property>
</bean>
可错误依旧。
我用的是spring+hibernate的框架,单独使用Quartz或hibernate都运行得很好。和在一起就报错。
研究了半天,看了SchedulerFactoryBean的源代码,终于找到了问题。原来问题出在我定义的datasource:
<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<bean>
SchedulerFactoryBean中的数据源属性名也叫datasource,我将整个系统的数据源名称定义为dataSource后,Quartz就将dataSource注入,同时认为应该从数据库中查询任务。所以出现上面的错误。
将<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<bean>
改为
<bean id="ds1" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="${jdbc.jndiName}" />
<bean>
后,问题解决。
这应该是Quartz的一个小小bug,希望它的新版本能解决这个问题。
此文转载自:东华_励志人生的BLOG