Spring,Quartz和JobStoreTX

时间:2012-09-07 13:30:06

标签: spring quartz-scheduler

通过使用 CronTriggerBean ,我创建了两个触发器(比如触发器A和B)来调用两个不同的动作。我们将我们的项目作为.war存放在2台服务器中。我正在使用 JobStoreTX 进行群集。我面临的问题是我想只聚集一个触发器,即A,触发器B不应该聚集。有没有办法通过代码指定哪个触发器必须被群集。我的代码如下所示。

<bean id="shedulerJobStoreTX" class="org.quartz.impl.jdbcjobstore.JobStoreTX>
  <property name="driverDelegateClass" value="org.quartz.impl. jdbcjobstore.oracle.OracleDelegate">
<property name="dataSource" value ="jndiDS"/>
        <property name="tablePrefix" value="someschemaName"/>
        <property name="isClustered" value="true"/>
<property name="clusterCheckinInterval" value="${someValue}"/>
    </bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">       
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
                <ref bean="clusterCronTrigger"/>
            </list>
        </property>
    </bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="runAppJob" />
        <property name="cronExpression" value="${someTimeValue1}"/>
    </bean>
    <bean id="clusterCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="runClusterJob" />
        <property name="cronExpression" value="${someTimeValue2}"/>
    </bean>

嗨,我已经改进了代码并且上面说的问题没有发生.PFB的代码也一样。

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
                <list>
                    <ref bean="cronTrigger" />
                    <ref bean="clusterCronTrigger"/>
                </list>
            </property>
            <property name="quartzProperties">
            <props>
              <prop key="org.quartz.jobStore.isClustered">false</prop> 
              <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
              <prop key ="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.
   JobStoreTX </prop> 
              <prop key="org.quartz.jobStore.tablePrefix">schemaName</prop> 
              <prop key="org.quartz.jobStore.driverDelegateClass"> org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop> 
              <prop key="org.quartz.jobStore.selectWithLockSQL"> SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME= ?</prop>
            </props>
            </property>
            <property name="dataSource" ref="fsmJndiDataSource"/> 

但执行上述代码的问题是,当石英试图获取锁时,我得到以下异常......“调用init方法失败;嵌套异常是org.quartz.SchedulerConfigException:作业恢复期间发生故障。[请参阅嵌套异常:org.quartz.impl.jdbcjobstore.LockException:获取数据库行锁失败:ORA-00942:表或视图不存在

2 个答案:

答案 0 :(得分:3)

在运行调度程序之前,需要在数据库中创建所需的石英表。

默认石英表sql脚本位于\ docs \ dbTables ..

示例如果您使用的是quartz 2.2.1发行版(quartz-2.2.1-distribution.tar \ quartz-2.2.1 \ docs \ dbTables \ tables_oracle)

在数据库上执行sql脚本并确保您看到在其中创建的表,请参阅下面的图像

enter image description here

答案 1 :(得分:0)

由于消息“ORA-00942:表或视图不存在”,我认为缺少表“schemaNameLOCKS”。的确,来自doc:

  

org.quartz.jobStore.selectWithLockSQL

     

必须是在“LOCKS”表中选择行的SQL字符串   在行上放置一个锁。如果未设置,则默认为“SELECT * FROM   {0} LOCKS SCHED_NAME = {1} AND LOCK_NAME =? FOR UPDATE“,哪个   适用于大多数数据库。在运行时使用“{0}”替换   您在上面配置的TABLE_PREFIX。 “{1}”替换为   调度程序的名称。