2

SpringでQuartz Schedulerを使用しています。Quartz のバージョンは 2.1.6、Spring のバージョンは 3.1.3 です。

構成は次のとおりです。

<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>

サーバーが停止して再起動され、その間にスケジューラーがジョブを逃した場合、サーバーが起動するとすぐに、逃したジョブを実行します。そこで、永続ストレージであるデータベースを使用しました。しかし、それは機能していないようです。

データベースで初めてサーバーを起動したとき、qrtz_triggers テーブルの列 NEXT_FIRE_TIME の値は 1356808500000 で、これは Sun Dec 30 00:45:00 IST 2012 を意味します。 45:00 IST 2012. 次に、サーバーを停止し、システム時刻を変更して、システム時刻を 31 Dec 12:47AM に設定しました。次に、サーバーを再度起動します。サーバーがジョブを逃したため、サーバーが起動するとすぐにスケジューラが実行されることを期待していました。しかし、ジョブを起動する代わりに、NEXT_FIRE_TIME 値が 1356981300000 に変更されました。これは 2013 年 1 月 1 日火曜日 00:45:00 IST です。

明らかにこれは望ましくなく、なぜこれが起こっているのかわかりません。どんな提案も私にとって非常に役に立ちます。

SessionFactory私が使用している はでorg.springframework.orm.hibernate4.LocalSessionFactoryBeanhibernate.hbm2ddl.autoは に設定されていupdateます。

アップデート

これは拡張するクラスですQuartzJobBean

public class LDAPSynchronizer extends QuartzJobBean {

    @Override
    protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
        List<Attributes> currentUsersAttributes = LDAPManager.getManager().getCurrentUsersAttributes();
        List<Attributes> pastUsersAttributes = LDAPManager.getManager().getPastUsersAttributes();       
        getLDAPSynchService(context).synchronizeUser(currentUsersAttributes, pastUsersAttributes);
    }   

    private ILDAPSynchService getLDAPSynchService(JobExecutionContext context)  {
        ApplicationContext applicationContext = null;

        try {
            applicationContext = (ApplicationContext) context.getScheduler().getContext().get("applicationContext");
        } catch (Exception e) {         
        }

        if(applicationContext == null) {
            applicationContext = ContextLoader.getCurrentWebApplicationContext();
        }


        return (ILDAPSynchService) applicationContext.getBean("ldapSynchService");
    }
}

アップデート

サーバーがコンソールで起動するたびに、次のログが取得されます。

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', ?, ?, ?, ?)

その後PREV_FIRE_TIME、QUARTZ_TRIGGERS` テーブルが -1 に設定されていることがわかります。そして、行数が1を超えることはありません。これが正常かどうかはわかりません。

4

1 に答える 1

1

2日間の勉強とネット検索の後、ついに問題を解決することができました. 正しいコードは次のとおりです。

<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>

<property name="overwriteExistingJobs" value="true" />問題を引き起こしていました。テーブルのNEXT_FIRE_TIME値を上書きしていました。QRTZ_TRIGGERS

于 2012-12-31T07:16:37.343 に答える