zoukankan      html  css  js  c++  java
  • Quartz SchedulerFactoryBean异常--Spring自动装配惹的祸

    Spring的配置文件,启用了自动装配模式:

    <beans default-autowire="byName">

    <bean id="dataSource" class="..."></bean>

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" lazy-init="false">
      <property name="triggers">
       <list><ref bean="clearLogsTrigger" /></list>
      </property>
     </bean>

      ...

    </beans>

    则此时会产生如下错误:

    Error creating bean with name 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' defined in file [E:workspaceeis_oracle2webWEB-INFclassesconfspringeisSystemScheduleContext.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 。

    解决:屏蔽掉自动装配,如下:

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="false">
      <property name="triggers">
       <list><ref bean="clearLogsTrigger" /></list>
      </property>
     </bean>

    另:启用jobstore的RAMJobStore(内存存储的)模式,配置如下:

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" autowire="false">
      <property name="triggers">
       <list> <ref bean="clearLogsTrigger" /></list>
      </property>
      <property name="quartzProperties">
       <props>
        <prop key="org.quartz.jobStore.class">org.quartz.simpl.RAMJobStore</prop>
       </props>
      </property>
     </bean>

    当设置了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 inQuartz 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.

  • 相关阅读:
    出现Invalid input of type: 'CacheKey'. Convert to a byte, string or number first
    如果错误发生在某个封装号的模块中,那请查看数据库里面的数据是不是哪里出现问题
    发现匿名用户问题
    关于序列化器中class Meta中属性说明
    序列化和反序列化
    前端出现has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource
    出现bad ruqest,查找原因思路
    注册验证出现错误Define UserView.model, UserView.queryset, or override UserView.get_queryset()
    跨域问题
    celery异步使用和启动方法
  • 原文地址:https://www.cnblogs.com/Hymen/p/3291636.html
Copyright © 2011-2022 走看看