gpt4 book ai didi

java - 未使用 CronTriggerFactoryBean 设置 CronTrigger 失火指令

转载 作者:太空宇宙 更新时间:2023-11-04 06:39:12 24 4
gpt4 key购买 nike

我正在使用以下 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 会多次尝试启 Action 业。

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

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

最佳答案

问题实际上出在我的调度程序配置中。在 org.springframework.scheduling.quartz.SchedulerFactoryBean 的声明中,我有一个属性

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

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

我确信应该在文档中更清楚地提及这一点,因为每次更改后没有更新触发器配置可能会非常令人沮丧。 falseoverwriteExistingJobs 的默认值。

关于java - 未使用 CronTriggerFactoryBean 设置 CronTrigger 失火指令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24912165/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com