Spring配置Quartz发生异常

Quartz是一个很好的定时任务调度组件,关于Quartz的基本概念,请参阅 http://www.opensymphony.com/quartz
spring将Quartz很好的集成在了一起。关于spring中Quartz的用法,网上很多,这里就不在叙述,大家可以查阅相关资料,这里主要描述在开发中遇到的一个问题。
这是我spring的配置文件:
<bean   id="LoadDists"   class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">  
  <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)  
网上有人说, quartz是jobstore用的HDBCJobStore模式,此时会从数据库查询任务。
改为:

<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

http://blog.sina.com.cn/s/blog_5537a55301000b8b.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值