Кварц и Spring - кластеризованный, но НЕ персистентный?

В моем приложении Spring я использую SchedulerFactoryBean интегрироваться с Кварцем. Мы собираемся кластеризировать экземпляры Tomcat, и таким образом я хочу иметь кластеризованную Кварцевую среду, так, чтобы те же задания не работали одновременно на различных веб-серверах.

Сделать это, мой app-context.xml следующие:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
        <list>
            <ref bean="cronTrigger"/>
            <ref bean="simpleTrigger" />
        </list>
    </property>
    <property name="dataSource" ref="dataSource"/>
    <property name="overwriteExistingJobs" value="true"/>
    <!-- found in applicationContext-data.xml -->
    <property name="applicationContextSchedulerContextKey" value="applicationContext"/>
    <property name="quartzProperties">
        <props>
            <prop key="org.quartz.scheduler.instanceName">SomeBatchScheduler</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.simpl.RAMJobStore</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.tablePrefix">QRTZ_</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">25</prop>
            <prop key="org.quartz.threadPool.threadPriority">5</prop>
        </props>
    </property>
</bean>

Все работает хорошо, за исключением того, что, когда я пытаюсь удалить или изменить триггер, затем перезапустите мое приложение, старые триггеры все еще сохраняются в DB и все еще выполняются. Я не хочу это, я просто хочу, чтобы они были удалены, когда приложение останавливается (или перезапущен). Я установил значение overwriteExistingJobs свойство, чтобы быть верным, так как я думал, что это - то, что оно сделало.

Какие-либо идеи? Все, для чего я хочу использовать DB, кластеризируется, не любой вид персистентности кроме того.

10
задан NorthCat 9 September 2014 в 07:05
поделиться

1 ответ

Я провел исследование по этой теме и это хорошо известная ошибка в Quartz, я нашел несколько сообщений на их форуме. Чтобы решить эту проблему, я создал bean-компонент, который удаляет все записи в таблице Quartz. Вы можете вызвать этот bean-компонент до того, как ваш Quartz-bean-компонент будет загружен (добавьте компонент «зависит от» для вашего bean-компонента Scheduler), когда ваш контекст Spring уничтожается (убедитесь, что пул соединений с БД все еще открыт), или вручную с помощью какой-либо формы UI. Не удивляйтесь, что в группах вакансий тоже есть ошибка. Моим первым исправлением было создание клиентской банки Quartz с исправлением, но было довольно сложно обновлять, когда они выпускали новую версию (в то время я использовал 1.4 или 1.5 - на самом деле не помню).

2
ответ дан 4 December 2019 в 04:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: