Java 未执行丢失的作业
我正在使用带Spring的石英调度器。石英版本为2.1.6,弹簧版本为3.1.3 以下是配置:Java 未执行丢失的作业,java,quartz-scheduler,spring-3,Java,Quartz Scheduler,Spring 3,我正在使用带Spring的石英调度器。石英版本为2.1.6,弹簧版本为3.1.3 以下是配置: <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="autoStartup" value="true" /> <property name="applicationContextSchedulerContextKey" value
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="waitForJobsToCompleteOnShutdown" value="true" />
<property name="overwriteExistingJobs" value="true" />
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
</props>
</property>
<property name="triggers">
<list>
<ref bean="ldapSynchJob" />
</list>
</property>
</bean>
<bean id="ldapSynchJob" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="ldapSynch" />
<property name="cronExpression" value="0 45 0 * * ?" />
<property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_FIRE_ONCE_NOW" />
</bean>
<bean id="ldapSynch" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.edfx.adb.ldap.scheduler.LDAPSynchronizer" />
</bean>
更新
每次在控制台中启动服务器时,我都会收到以下日志:
01:28:24,586 INFO [org.quartz.core.QuartzScheduler] (MSC service thread 1-10) Scheduler meta-data: Quartz Scheduler (v2.1.6) 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' with instanceId 'NON_CLUSTERED'
Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
NOT STARTED.
Currently in standby mode.
Number of jobs executed: 0
Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
Using job-store 'org.springframework.scheduling.quartz.LocalDataSourceJobStore' - which supports persistence. and is not clustered.
01:28:24,596 INFO [org.quartz.impl.StdSchedulerFactory] (MSC service thread 1-10) Quartz scheduler 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' initialized from an externally provided properties instance.
01:28:24,596 INFO [org.quartz.impl.StdSchedulerFactory] (MSC service thread 1-10) Quartz scheduler version: 2.1.6
01:28:24,596 INFO [org.quartz.core.QuartzScheduler] (MSC service thread 1-10) JobFactory set to: org.springframework.scheduling.quartz.AdaptableJobFactory@1014d1b6
01:28:24,666 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT * FROM QRTZ_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,706 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT * FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,716 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND LOCK_NAME = ? FOR UPDATE
01:28:24,716 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT JOB_NAME FROM QRTZ_JOB_DETAILS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND JOB_NAME = ? AND JOB_GROUP = ?
01:28:24,716 INFO [stdout] (MSC service thread 1-10) Hibernate: UPDATE QRTZ_JOB_DETAILS SET DESCRIPTION = ?, JOB_CLASS_NAME = ?, IS_DURABLE = ?, IS_NONCONCURRENT = ?, IS_UPDATE_DATA = ?, REQUESTS_RECOVERY = ?, JOB_DATA = ? WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND JOB_NAME = ? AND JOB_GROUP = ?
01:28:24,726 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT * FROM QRTZ_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,726 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT * FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,726 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT * FROM QRTZ_LOCKS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND LOCK_NAME = ? FOR UPDATE
01:28:24,736 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT J.JOB_NAME, J.JOB_GROUP, J.IS_DURABLE, J.JOB_CLASS_NAME, J.REQUESTS_RECOVERY FROM QRTZ_TRIGGERS T, QRTZ_JOB_DETAILS J WHERE T.SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND J.SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND T.TRIGGER_NAME = ? AND T.TRIGGER_GROUP = ? AND T.JOB_NAME = J.JOB_NAME AND T.JOB_GROUP = J.JOB_GROUP
01:28:24,736 INFO [stdout] (MSC service thread 1-10) Hibernate: DELETE FROM QRTZ_SIMPLE_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,736 INFO [stdout] (MSC service thread 1-10) Hibernate: DELETE FROM QRTZ_CRON_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,736 INFO [stdout] (MSC service thread 1-10) Hibernate: DELETE FROM QRTZ_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,746 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT TRIGGER_NAME FROM QRTZ_TRIGGERS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_NAME = ? AND TRIGGER_GROUP = ?
01:28:24,746 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT TRIGGER_GROUP FROM QRTZ_PAUSED_TRIGGER_GRPS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_GROUP = ?
01:28:24,746 INFO [stdout] (MSC service thread 1-10) Hibernate: SELECT TRIGGER_GROUP FROM QRTZ_PAUSED_TRIGGER_GRPS WHERE SCHED_NAME = 'org.springframework.scheduling.quartz.SchedulerFactoryBean#0' AND TRIGGER_GROUP = ?
01:28:24,746 INFO [stdout] (MSC service thread 1-10) Hibernate: INSERT INTO QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, JOB_NAME, JOB_GROUP, DESCRIPTION, NEXT_FIRE_TIME, PREV_FIRE_TIME, TRIGGER_STATE, TRIGGER_TYPE, START_TIME, END_TIME, CALENDAR_NAME, MISFIRE_INSTR, JOB_DATA, PRIORITY) VALUES('org.springframework.scheduling.quartz.SchedulerFactoryBean#0', ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
01:28:24,756 INFO [stdout] (MSC service thread 1-10) Hibernate: INSERT INTO QRTZ_CRON_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, CRON_EXPRESSION, TIME_ZONE_ID) VALUES('org.springframework.scheduling.quartz.SchedulerFactoryBean#0', ?, ?, ?, ?)
然后我看到石英触发器的上一次点火时间表被设置为-1。并且行数永远不会超过1。我不知道这是否正常。经过两天的网上学习和搜索,我终于解决了这个问题。以下是正确的代码:
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="waitForJobsToCompleteOnShutdown" value="true" />
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
</props>
</property>
<property name="triggers">
<list>
<ref bean="ldapSynchJob" />
</list>
</property>
</bean>
<bean id="ldapSynchJob" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="ldapSynch" />
<property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_FIRE_ONCE_NOW" />
<property name="cronExpression" value="0 17 12 * * ?" />
</bean>
<bean id="ldapSynch" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.edfx.adb.ldap.scheduler.LDAPSynchronizer" />
</bean>
org.quartz.impl.jdbcjobstore.StdJDBCDelegate
是导致问题的原因。它正在覆盖QRTZ\u触发器的NEXT\u FIRE\u TIME
值
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="autoStartup" value="true" />
<property name="applicationContextSchedulerContextKey" value="applicationContext" />
<property name="waitForJobsToCompleteOnShutdown" value="true" />
<property name="dataSource" ref="dataSource" />
<property name="transactionManager" ref="transactionManager" />
<property name="quartzProperties">
<props>
<prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.StdJDBCDelegate</prop>
</props>
</property>
<property name="triggers">
<list>
<ref bean="ldapSynchJob" />
</list>
</property>
</bean>
<bean id="ldapSynchJob" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="ldapSynch" />
<property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_FIRE_ONCE_NOW" />
<property name="cronExpression" value="0 17 12 * * ?" />
</bean>
<bean id="ldapSynch" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.edfx.adb.ldap.scheduler.LDAPSynchronizer" />
</bean>