Spring, Quartz и JobStoreTX

Используя CronTriggerBean, я создал два триггера (скажем, триггер A и B) для вызова двух разных действий. Мы разместили наш проект как .war на 2 серверах. Я использую JobStoreTX для кластеризации. Проблема, с которой я столкнулся, заключается в том, что я хочу сгруппировать только один триггер, т.е. триггер A и B не должны быть сгруппированы. Есть ли способ указать через код, какой триггер должен быть кластеризован. Мой код продолжается, как показано ниже.

<bean id="shedulerJobStoreTX" class="org.quartz.impl.jdbcjobstore.JobStoreTX>
  <property name="driverDelegateClass" value="org.quartz.impl. jdbcjobstore.oracle.OracleDelegate">
<property name="dataSource" value ="jndiDS"/>
        <property name="tablePrefix" value="someschemaName"/>
        <property name="isClustered" value="true"/>
<property name="clusterCheckinInterval" value="${someValue}"/>
    </bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">       
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
                <ref bean="clusterCronTrigger"/>
            </list>
        </property>
    </bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="runAppJob" />
        <property name="cronExpression" value="${someTimeValue1}"/>
    </bean>
    <bean id="clusterCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="runClusterJob" />
        <property name="cronExpression" value="${someTimeValue2}"/>
    </bean>

Привет, я усовершенствовал код, и вышеупомянутая проблема не возникает. PFB код для того же самого.

  <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
                <list>
                    <ref bean="cronTrigger" />
                    <ref bean="clusterCronTrigger"/>
                </list>
            </property>
            <property name="quartzProperties">
            <props>
              <prop key="org.quartz.jobStore.isClustered">false</prop> 
              <prop key="org.quartz.scheduler.instanceId">AUTO</prop> 
              <prop key ="org.quartz.jobStore.class">org.quartz.impl.jdbcjobstore.
   JobStoreTX </prop> 
              <prop key="org.quartz.jobStore.tablePrefix">schemaName</prop> 
              <prop key="org.quartz.jobStore.driverDelegateClass"> org.quartz.impl.jdbcjobstore.oracle.OracleDelegate</prop> 
              <prop key="org.quartz.jobStore.selectWithLockSQL"> SELECT * FROM {0}LOCKS UPDLOCK WHERE LOCK_NAME= ?</prop>
            </props>
            </property>
            <property name="dataSource" ref="fsmJndiDataSource"/> 

Но проблема при выполнении приведенного выше кода заключается в том, что я получаю следующее исключение, когда кварц пытается получить блокировку..."Ошибка вызова метода инициализации; вложенным исключением является org.quartz.SchedulerConfigException: Ошибка произошла во время восстановление задания. [См. вложенное исключение: org.quartz.impl.jdbcjobstore.LockException: Ошибка при получении блокировки строки БД: ORA-00942: таблица или представление не существует"


person user1096098    schedule 07.09.2012    source источник


Ответы (2)


Из-за сообщения «ORA-00942: таблица или представление не существует», я думаю, что таблица «schemaNameLOCKS» отсутствует. Действительно, из документа:

org.quartz.jobStore.selectWithLockSQL

Должна быть строкой SQL, которая выбирает строку в таблице «LOCKS» и устанавливает блокировку на строку. Если не задано, по умолчанию используется вариант «ВЫБЕРИТЕ * ИЗ {0}LOCKS WHERE SCHED_NAME = {1} AND LOCK_NAME = ? ДЛЯ ОБНОВЛЕНИЯ», который работает для большинства баз данных. "{0}" заменяется во время выполнения на TABLE_PREFIX, который вы настроили выше. «{1}» заменяется именем планировщика.

person Vincent Devillers    schedule 10.09.2012

вам необходимо создать необходимые кварцевые таблицы в базе данных перед запуском планировщика.

SQL-скрипт для кварцевых таблиц по умолчанию доступен по адресу \docs\dbTables..

пример, если вы используете дистрибутив кварца 2.2.1 (quartz-2.2.1-distribution.tar\quartz-2.2.1\docs\dbTables\tables_oracle)

выполните скрипт sql в базе данных и убедитесь, что вы видите созданные в нем таблицы, см. изображение ниже.

введите здесь описание изображения

person Motilal    schedule 13.10.2015