服务器关闭后重新触发 Quartz 作业

Mar*_*nik 3 java spring quartz-scheduler

最近,我开始使用具有以下属性的 Quartz 持久作业存储:

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
Run Code Online (Sandbox Code Playgroud)

我在 spring 中使用基于 cron 的触发器定义了一个示例作业:

 <bean id="sampleCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
   <property name="jobDetail" ref="sampleJobDetail"/>
   <property name="cronExpression" value="0/5 * * * * ?"/>
Run Code Online (Sandbox Code Playgroud)

我看到作业确实每 5 秒执行一次,一切都很好。现在我停止该程序,这是一个简单的控制台应用程序,没有 Web 容器或任何其他内容,等待约 30 秒并重新运行我的程序。我看到的是,当调度程序启动时,作业会被触发很多次。例如,如果作业执行如下:

public class SampleJob implements Serializable, Job {
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
    System.out.println("Executing the job Job  " + new Date());
}
Run Code Online (Sandbox Code Playgroud)

}

重启后输出如下:

 Executing the job Job  Mon Mar 31 08:34:18 IDT 2014
 Executing the job Job  Mon Mar 31 08:34:18 IDT 2014
 Executing the job Job  Mon Mar 31 08:34:18 IDT 2014
Run Code Online (Sandbox Code Playgroud)

然后它每 5 秒再次工作一次。

 Executing the job Job  Mon Mar 31 08:34:20 IDT 2014
 Executing the job Job  Mon Mar 31 08:34:25 IDT 2014
Run Code Online (Sandbox Code Playgroud)

....

在实际应用程序中,我将实现清理数据库的作业(当然它不会每 5 秒运行一次:))但我确实计划有时服务器会重新启动并保持关闭一段时间,我希望该作业在重新启动后仅执行一次。可以这样做吗?

我使用 SchedulerFactoyBean 进行以下配置:

<bean id="quartzSchedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean" destroy-method="destroy">
    <property name="configLocation" value="classpath:scheduler-quartz.properties"/>
    <property name="quartzProperties" ref="qrtzProperties"/>
    <property name="autoStartup" value="true" />

    <property name="triggers">
        <list>             
            <ref bean="sampleCronTrigger"/>
        </list>
    </property>
</bean>
Run Code Online (Sandbox Code Playgroud)

提前致谢

kos*_*tya 5

尝试在sampleCronTrigger上设置misfire指令:

   <property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_DO_NOTHING"/>
Run Code Online (Sandbox Code Playgroud)

这是一篇关于失火指令的大文章