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 { ... }

ただし、ミスファイア命令セットはまったく効果がありません。長いアプリのダウンタイムの後、トリガーが複数回失敗すると、Quartz は何度もジョブを開始しようとします。

私がチェックしようとしたときcontext.getTrigger().getMisfireInstruction()MorningJob.execute()それは0を与えますCronTrigger.MISFIRE_INSTRUCTION_FIRE_ONCE_NOWが、1です.

失火命令が設定されていない理由はありますか?

4

1 に答える 1

1

問題は実際にはスケジューラの構成にありました。org.springframework.scheduling.quartz.SchedulerFactoryBeanI had a propertyの宣言で

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

最初に、テスト目的で、トリガーが適切に起動することを確認するために、数秒ごとにトリガーを実行するように構成しました。overwriteExistingJobsデータベースに保存されたトリガーは、cron 式の変更後に実際には更新されmisfireInstructionず、実際にも適用されませんでした。トリガーを更新するには、scheduler.clear()一度実行するか、前述のプロパティをしばらく true に設定する必要があります。

変更のたびにトリガー構成が更新されないのは本当にイライラする可能性があるため、これについてはドキュメントでより明確に言及する必要があると確信しています。falseのデフォルト値ですoverwriteExistingJobs

于 2014-07-23T21:08:38.447 に答える