Java 带有 Spring 框架的 Quartz JobStore

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/1187882/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-12 00:39:59  来源:igfitidea点击:

Quartz JobStore with Spring Framework

javaspringquartz-scheduler

提问by firstthumb

I am implementing Quartz Job Store on Oracle DB using Spring Framework. My ApplicationContext.xml is below

我正在使用 Spring Framework 在 Oracle DB 上实现 Quartz Job Store。我的 ApplicationContext.xml 在下面

<bean id="driverJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="BatchFileCollector" />
</bean>

<bean id="ranchTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
    <property name="jobDetail" ref="driverJob" />
    <property name="startDelay" value="2000" />
    <property name="repeatInterval" value="10000" />
</bean>

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="ranchTrigger" />
        </list>
    </property>
    <property name="dataSource">
        <ref bean="dataSource.TEXAN"/>
    </property>
    <property name="applicationContextSchedulerContextKey">
        <value>applicationContext</value>
    </property>
    <property name="autoStartup">
        <value>true</value>
    </property>
    <property name="configLocation" value="classpath:quartz.properties"/>
</bean>

This configuration gives me the below error.

此配置给了我以下错误。

Caused by: org.quartz.JobPersistenceException: 

Couldn't store trigger: The job (DEFAULT.driverJob) referenced by the trigger does not exist. 

[See nested exception: org.quartz.JobPersistenceException: The job (DEFAULT.driverJob) referenced by the trigger does not exist.]

I am using Spring Framework 2.5.6. Do I have to upgrade my Quartz version? I cannot find the problem.

我正在使用 Spring 框架 2.5.6。我必须升级我的 Quartz 版本吗?我找不到问题所在。

Thanks for your help.

谢谢你的帮助。

采纳答案by cafebabe

Your SchedulerFactoryBean needs to have the "driverJob" registered, too. Along with your triggers, add a list of jobDetails.

您的 SchedulerFactoryBean 也需要注册“driverJob”。连同您的触发器,添加一个 jobDetails 列表。

<bean id="job.statistics.DailyQPSValidationJobTrigger" class="org.quartz.CronTrigger">
    <property name="name" value="DailyQPSValidationTrigger" />
    <property name="jobName" value="DailyQPSValidation" />
    <property name="jobGroup" value="Statistics" />
    <property name="volatility" value="false" />
    <!-- Each day, 4 o'clock AM -->
    <property name="cronExpression" value="0 0 4 * * ?" />
</bean>

<!-- Scheduler -->

<bean id="job.SchedulerProperties" class="somecompany.someproduct.util.spring.PropertiesFactoryBean"
    scope="singleton">
    <property name="source">
        <props>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
            <prop key="org.quartz.scheduler.instanceName">JobCluster</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.jobStore.useProperties">false</prop>
        </props>
    </property>
</bean>

<bean id="job.Scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" scope="singleton"
    lazy-init="false">
    <property name="startupDelay" value="30" />
    <property name="waitForJobsToCompleteOnShutdown" value="true" />
    <property name="dataSource" ref="jdbc.DataSource" />
    <property name="quartzProperties" ref="job.SchedulerProperties" />
    <property name="jobDetails">
        <list>
            <ref bean="job.statistics.DailyQPSValidationJobDetail" />
        </list>
    </property>
    <property name="triggers">
        <list>
            <ref bean="job.statistics.DailyQPSValidationJobTrigger" />
        </list>
    </property>
    <property name="schedulerListeners">
        <list>
            <bean class="somecompany.someproduct.job.SchedulerErrorListener">
                <property name="monitoringService" ref="monitoring.MonitoringService" />
            </bean>
        </list>
    </property>
    <property name="globalJobListeners">
        <list>
            <bean class="somecompany.someproduct.job.JobErrorListener">
                <property name="name" value="JobErrorListener" />
                <property name="monitoringService" ref="monitoring.MonitoringService" />
            </bean>
        </list>
    </property>
</bean>

回答by dave

I'm not sure if this will work, but you could try using:

我不确定这是否有效,但您可以尝试使用:

   <bean id="driverJob" .../>

instead of:

代替:

   <bean name="driverJob" .../>

回答by user809959

I have the same problem with Quartz 1.5.2 and Spring 3.0.4. The problem is that the JobStoreSupport class tries to store a cron trigger with a foreign key to the job (tries to load the job from the db), which is not persisted yet.

Quartz 1.5.2 和 Spring 3.0.4 也有同样的问题。问题是 JobStoreSupport 类试图存储一个带有外键的 cron 触发器到作业(尝试从数据库加载作业),但尚未持久化。

Same problem with quartz 1.6.1, 1.7.2 versions.

石英 1.6.1、1.7.2 版本也有同样的问题。

<bean id="quartzScheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
      depends-on="quartzDatabaseCreator">
    <property name="autoStartup">
        <value>true</value>
    </property>
    <property name="dataSource">
        <ref bean="dataSource"/>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME = ?
            </prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.${qrtz.delegateClass}
            </prop>
        </props>
    </property>
    <property name="triggers">
        <list>
            <ref bean="cronTrigger"/>
        </list>
    </property>
    <property name="schedulerContextAsMap">
        <map>
            <entry key="sygnoServerHelper"><ref bean="sygnoServerHelper"/></entry>
            <entry key="requestDAO"><ref bean="requestDAO"/></entry>
            <entry key="alairoCache"><ref bean="alairoCache"/></entry>
        </map>
    </property>
</bean>

<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="checkGracePeriodJob" />
    <!--                                 # s m h dom mon dow [y]  -->
    <property name="cronExpression" value="0 0/5 * * * ?" />
</bean>

<bean id="checkGracePeriodJob" class="org.springframework.scheduling.quartz.JobDetailBean">
    <property name="jobClass" value="com.synergon.sygnoserver.CheckGracePeriodJob"/>
 </bean>