1

我正在使用以下 Spring XML 配置创建一个 Quartz 作业:

<bean class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
    <property name="jobDetail">
        <bean class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
            <property name="name" value="The job"/>
            <property name="group" value="The group"/>
            <property name="jobClass" value="com.example.myapp.MorningJob"/>
            <property name="jobDataMap">
                <util:map>
                    <entry key="key1"
                           value="val1"/>
                    <entry key="key2"
                           value="val2"/>
                </util:map>
            </property>
        </bean>
    </property>
    <property name="cronExpression" value="0 0 6 * * ? *"/>
    <property name="misfireInstruction"
        value="#{T(org.quartz.CronTrigger).MISFIRE_INSTRUCTION_FIRE_ONCE_NOW}"/>
    <property name="timeZone" ref="timezone"/>
</bean>

我的工作看起来像这样

@Configurable
@DisallowConcurrentExecution
@PersistJobDataAfterExecution
public class MorningJob implements Job { ... }

但是,misfire 指令集完全没有效果。在长时间的应用程序停机后,当触发器多次丢失时,Quartz 会尝试多次启动作业。

当我试图从中检查context.getTrigger().getMisfireInstruction()时,MorningJob.execute()它给出了 0,而CronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOW为 1。

任何想法为什么没有设置失火指令?

4

1 回答 1

1

问题实际上出在我的调度程序配置中。在org.springframework.scheduling.quartz.SchedulerFactoryBean我有财产的声明中

<property name="overwriteExistingJobs" value="false"/>

最初,出于测试目的,我将触发器配置为每隔几秒钟运行一次,以查看它是否正常触发。overwriteExistingJobs意味着保存在数据库中的触发器在更改 cron 表达式后实际上并没有更新,misfireInstruction也没有实际应用。要更新触发器,我需要运行scheduler.clear()一次或将提到的属性设置为 true 一段时间。

我确信这应该在文档中更清楚地提及,因为每次更改后没有更新触发器配置可能真的很令人沮丧。false是 的默认值overwriteExistingJobs

于 2014-07-23T21:08:38.447 回答