Кластерный кварцевый планировщик не работает правильно? - PullRequest
0 голосов
/ 13 марта 2012

Я использую Spring 2.5 и Quartz Scheduler 1.8.6 в кластерной конфигурации.Эта работа синхронизирует две базы данных.У меня есть следующая конфигурация:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean" id="quartzScheduler" lazy-init="false">
    <property name="applicationContextSchedulerContextKey" value="applicationContext"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="transactionManager" ref="transactionManager"/>
    <property name="overwriteExistingJobs" value="true"/>
    <property name="autoStartup" value="true"/>
    <property name="triggers">
        <list>
            <bean class="org.springframework.scheduling.quartz.CronTriggerBean" id="someCronTrigger">
                <property name="jobDetail" ref="myQuartzJobDetail"/>
                <property name="cronExpression" value="${cronExpression}"/>
            </bean>
        </list>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">MyBatchScheduler</prop>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">1</prop>
            <!-- Don't set thread priority for now -->
            <prop key="org.quartz.jobStore.misfireThreshold">30000</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop>
            <prop key="org.quartz.jobStore.useProperties">false</prop>
            <prop key="org.quartz.jobStore.tablePrefix">QRTZ_</prop>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.jobStore.clusterCheckinInterval">5000</prop>
        </props>
    </property>
</bean>

Со свойством cronExpression установлено значение:

cronExpression=0 * * * * ?

т.е. я хочу, чтобы он запускался каждую минуту.У меня есть две машины, выполняющие эту работу с точно такой же конфигурации .Я вижу этот результат:

Machine 1                                                   Machine 2
2012-03-13 09:47:00,009 INFO  Starting synchronization...   2012-03-13 09:46:00,041 INFO  Starting synchronization...
2012-03-13 09:54:00,010 INFO  Starting synchronization...   2012-03-13 09:51:00,041 INFO  Starting synchronization...
2012-03-13 10:00:00,010 INFO  Starting synchronization...   2012-03-13 09:57:00,042 INFO  Starting synchronization...
2012-03-13 10:02:00,007 INFO  Starting synchronization...   2012-03-13 09:59:00,042 INFO  Starting synchronization...

Я в недоумении, почему эти два приложения не запускаются каждую минуту, как они должны быть.Например, из двух журналов, описанных выше, работа не запускается в 9:48, 9:49, 9:50, 9:52, 9:53 и т. Д. Есть идеи?

РЕДАКТИРОВАТЬ:

Итак, как я сказал в комментарии ниже, моя проблема заключалась в том, что был случайный процесс, который я не искал, который потреблял некоторые триггеры каждую минуту.Я убил тот случайный процесс, и тогда он заработал как надо.

1 Ответ

0 голосов
/ 13 марта 2012

У вас нет никакого контроля над тем, какой сервер запускает задание, но вы гарантированно, что он будет работать ровно один раз на том или ином компьютере. Обратите внимание, что если системное время не точно синхронизировано на каждой машине в кластере Quartz, балансировка нагрузки не будет работать надежно. Скорее всего, сервер с наибольшим временем в будущем будет работать чаще, если не все задания в одиночку.

почему эти два приложения не запускают работу каждую минуту

Я не понимаю этого вопроса. Вы имеете в виду, что некоторые задания вообще не выполняются (о чем говорит ваш журнал, например, пропускает 09:48:00)?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...