我正在使用以下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 { ... }
然而,失火指令集完全没有效果。经过长时间的应用程序停机,当触发器多次错过时,Quartz会尝试多次启动该作业。
当我尝试从context.getTrigger().getMisfireInstruction()
检查MorningJob.execute()
时,它会给出0,而CronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOW
为1。
为什么没有设置失火指令?
答案 0 :(得分:0)
问题实际上在我的调度程序配置中。在org.springframework.scheduling.quartz.SchedulerFactoryBean
的声明中我有一个属性
<property name="overwriteExistingJobs" value="false"/>
最初,出于测试目的,我已将触发器配置为每隔几秒运行一次,以便正常启动。 overwriteExistingJobs
表示保存在数据库中的触发器在更改cron表达式后实际未更新,并且misfireInstruction
也未实际应用。要更新触发器,我需要运行scheduler.clear()
一次或将提到的属性设置为true一段时间。
我确信在文档中应该更清楚地提到这一点,因为在每次更改后没有更新触发器配置可能会非常令人沮丧。 false
是overwriteExistingJobs
的默认值。