Кварцевая кластеризация - триггеры дублируются при запуске сервера

Мы столкнулись с проблемой при использовании Quartz 2.1.6 с Spring 3.1 в кластерной конфигурации (с хранилищем данных JDBC). Текущий контекст:

  • Задания и триггеры CRON определены в файле конфигурации пружины (см. Ниже)
  • Свойство overwriteExistingJobs имеет значение true в SchedulerFactoryBean, поэтому мы не добавляем новые определения заданий в БД при каждом развертывании.
  • Однако после каждого развертывания в кластере кажется, что каждый узел заново создает данные триггера. Например, если у нас есть 2 триггера, указывающих на 1 задание и 4 узла, после развертывания кластера БД имеет 1 определение задания и 4x2 триггера. Каждое повторное развертывание добавляет 4x2 триггеров.

Это нормальное поведение? Если да: как мы можем сказать Кварцу не создавать заново данные триггера при каждом развертывании? (или перезаписать эти данные, как с Джобсом)

<bean name="myJob" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
    <property name="jobClass" value="com.etc.MyJob" />
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"
    p:waitForJobsToCompleteOnShutdown="false" lazy-init="false">

    <property name="dataSource" ref="myDataSource" />
    <property name="transactionManager" ref="transactionManager" />
    <property name="overwriteExistingJobs" value="true" />
    <property name="autoStartup" value="true" />
    <property name="jobFactory">
                <bean class="org.springframework.scheduling.quartz.SpringBeanJobFactory"/>
            </property>
    <property name="triggers">
        <list>
            <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean" p:cronExpression="0 0 0 * * ?"                   p:misfireInstruction="2">
                <property name="jobDetail" ref="myJob" />
            </bean>
            <bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean "
                p:cronExpression="0 0 20 * * ?"
                p:misfireInstruction="2">
                <property name="jobDetail" ref="myJob" />
            </bean>
        </list>
    </property>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">fsbu_scheduler</prop>
            <prop key="org.quartz.scheduler.instanceId">AUTO</prop>

            <prop key="org.quartz.jobStore.misfireThreshold">60000</prop>
            <prop key="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.JobStoreTX</prop>
            <prop key="org.quartz.jobStore.driverDelegateClass">org.quartz.impl.jdbcjobstore.oracle.weblogic.WebLogicOracleDelegate
            </prop>
            <prop key="org.quartz.jobStore.selectWithLockSQL">SELECT * FROM {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? FOR UPDATE
            </prop>
            <prop key="org.quartz.jobStore.tablePrefix">fsqrz_</prop>
            <prop key="org.quartz.scheduler.skipUpdateCheck">true</prop>
            <prop key="org.quartz.jobStore.isClustered">true</prop>
            <prop key="org.quartz.threadPool.class">org.quartz.simpl.SimpleThreadPool</prop>
            <prop key="org.quartz.threadPool.threadCount">3</prop>
            <prop key="org.quartz.plugin.triggHistory.class">org.quartz.plugins.history.LoggingTriggerHistoryPlugin
            </prop>
            <prop key="org.quartz.plugin.triggHistory.triggerFiredMessage">Trigger {1}.{0} fired job {6}.{5} at {4, date,
                yyyy-MM-dd HH:mm:ss}
            </prop>
            <prop key="org.quartz.plugin.triggHistory.triggerCompleteMessage">Trigger {1}.{0} completed firing job {6}.{5} at {4,
                date, yyyy-MM-dd HH:mm:ss} with resulting trigger instruction code
                {9}
            </prop>
        </props>
    </property>
</bean>

1 ответ

Решение

Определение бина для каждого Триггера не имело атрибута "имя". Таким образом, Spring CronTriggerFactory динамически генерировал новое имя триггера при каждом развертывании, что являлось причиной, по которой это вызывало аддитивный эффект (триггеры с разными именами не перезаписывались).

Добавление name="..." с уникальным значением к каждому определению триггера решило проблему.

Другие вопросы по тегам