最近我开始使用具有以下属性的 Quartz Persistent Job Store:
org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX
org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.PostgreSQLDelegate
我已经在 spring 中使用基于 cron 的触发器定义了一个示例作业:
<bean id="sampleCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="sampleJobDetail"/>
<property name="cronExpression" value="0/5 * * * * ?"/>
我看到作业真的每 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());
}
重启后的输出是这样的:
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
然后它每 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
....
在实际应用程序中,我将执行清理数据库的工作(当然它不会每 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>
提前致谢
最佳答案
尝试在 sampleCronTrigger 上设置 misfire 指令:
<property name="misfireInstructionName" value="MISFIRE_INSTRUCTION_DO_NOTHING"/>
这是一篇关于misfire instructions的大文章
关于java - 服务器关闭后 Quartz 作业重新触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22754318/