Quartz Spring CronTrigger срабатывает больше раз, чем настроено

У меня есть cronTrigger для работы "digestJob":

<bean id="digestCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean"> 
    <property name="jobDetail" ref="digestJob" />
    <property name="cronExpression" value="0 35 15 * * ?" />
</bean>

Вот моя конфигурация schedulerFactoryBean:

<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="digestCronTrigger" />   
            </list>
        </property>
    </bean>

Проблема в том, что дайджестCronTrigger должен срабатывать ОДИН РАЗ каждый день в 17:35, но он срабатывает ДВАЖДЫ в указанное время. Однако, когда я использую SimpleTrigger:

<bean id="digestTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
        <property name="jobDetail" ref="digestJob" />
        <property name="startDelay" value="0" />
        <property name="repeatInterval" value="10000" />
    </bean>

все работает нормально и триггер срабатывает ровно раз в 10 секунд. Почему дайджестCronTrigger срабатывает дважды? Что-то не так с моим выражением cron или есть какое-то свойство, которое мне не хватает? Любая помощь будет высоко ценится.


person craftsman    schedule 20.07.2010    source источник
comment
Для 17:35 правильным выражением cron будет (0 35 17 * * ?), кроме того, выражение cron идеально.   -  person Jose Diaz    schedule 20.07.2010


Ответы (4)


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

person craftsman    schedule 26.07.2010
comment
Меня не волнует, если этот комментарий будет помечен как слишком болтливый, и я иду против своей честности, поскольку я поднял много флагов за это. Человек, ты спас мой день. - person reallynice; 17.07.2014
comment
мастер, ветка закончилась постом у меня именно такая проблема. Можете ли вы опубликовать свое решение? Спасибо .. Каким было ваше окончательное решение? - person Alexander Suraphel; 04.06.2016

Это также может произойти, если вы создаете триггер при запуске приложения и используете источник данных в файлеquart.properties. Каждый раз, когда вы запускаете сервер, он записывает новый триггер в таблицы QRTZ_CRON_TRIGGERS и QRTZ_TRIGGERS и использует их все при каждом перезапуске.

person gary69    schedule 30.06.2016
comment
Как этого избежать? - person wild_nothing; 01.02.2017
comment
Я избежал этого, убедившись, что у моей работы и моего триггера есть имя. Если вы не установите эти свойства, новые триггеры будут добавляться при каждом запуске вашего приложения. - person wild_nothing; 01.02.2017

Попробуй это:

    <bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
        <property name="triggers">
            <list>
                <ref bean="cronTrigger" />
            </list>
        </property>
    </bean>

    <bean id="jobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
      <property name="targetObject" ref="actionObject" />
      <property name="targetMethod" value="actionMethod" />
    </bean>

    <bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
        <property name="jobDetail" ref="jobDetail"/>
        <property name="cronExpression" value="0 15 17 * * ?"/>
    </bean>
person Jose Diaz    schedule 20.07.2010

У меня также есть эта проблема, и мы, наконец, нашли основную причину. Есть некоторая проблема в настройке нашего сервера Tomcat /.../Tomcat/conf/server.xml
Наш server.xml выглядит так, как показано ниже. В одном и том же tomcat есть 2 <Host>, которые регулярно запускают один и тот же cronJob, но одновременно пишут в один и тот же файл журнала и базу данных, поэтому он срабатывает. два раза по расписанию, но если мы запустим cronjob вручную, он сработает только один раз...
Решение, конечно, состоит в том, чтобы удалить один хост, надеюсь, что это поможет


<Server port="8005" shutdown="SHUTDOWN">
    ...
      <Service name="Catalina">
    ...
        <Engine name="Catalina" defaultHost="localhost">
            <Host name="localhost"  appBase="webapps"
                unpackWARs="true" autoDeploy="true">
                <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs"
                       prefix="localhost_access_log." suffix=".txt"
                       pattern="%h %l %u %t &quot;%r&quot; %s %b" />
            </Host>
            <Host name="<domain_name>" appBase="webapps" unpackWARs="true" autoDeploy="true">
                <Alias><domain_name></Alias>
                <Valve className="org.apache.catalina.valves.AccessLogValve"
                     directory="logs"   prefix="localhost_access_log." suffix=".txt"
                     pattern="%h %l %u %t &quot;%r&quot; %s %b" resolveHosts="false" />
            </Host>
        </Engine>
      </Service>
    </Server>
person Maxwell Cheng    schedule 20.05.2021