我有一个从春天Qquartz每20秒执行的Java程序。 有时,它只需几秒钟就可以执行,但作为数据变大我敢肯定,它运行20秒以上。
如何防止石英从发射/时,仍执行一个实例触发的工作吗? 射击2个工作在数据库上执行相同的操作就不会这么好。 有没有一种方法,我可以做一些同步?
我有一个从春天Qquartz每20秒执行的Java程序。 有时,它只需几秒钟就可以执行,但作为数据变大我敢肯定,它运行20秒以上。
如何防止石英从发射/时,仍执行一个实例触发的工作吗? 射击2个工作在数据库上执行相同的操作就不会这么好。 有没有一种方法,我可以做一些同步?
如果你需要做的就是火每20秒,石英是严重的矫枉过正。 该java.util.concurrent.ScheduledExecutorService
应该是完成此项工作完全足够。
的ScheduledExecutorService
还提供了两个语义用于调度。 “固定利率”将尝试无论重叠每20秒运行你的工作,而“固定延迟”会试图离开第一份工作的结束和下一个开始之间20秒。 如果你想避免重叠,然后固定延迟是最安全的。
如果你改变你的类来实现StatefulJob,而不是工作,石英会照顾这个要求。 从StatefulJob的javadoc :
有状态的作业不允许同时执行,这意味着发生执行(XX)方法完成将被延迟之前新的触发器。
StatefulJob扩展工作,并没有添加任何新的方法,因此,所有你需要做的就是你想要的行为是改变这样的:
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
为此:
public class YourJob implements org.quartz.StatefulJob {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
在石英的2.0版本, StatefulJob
已被弃用。 现在建议使用注释来代替,如
@DisallowConcurrentExecution
public class YourJob implements org.quartz.Job {
void execute(JobExecutionContext context) {/*implementation omitted*/}
}
万一有人引用了这个问题,StatefulJob已被弃用。 他们现在建议你使用注释,而不是...
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class TestJob implements Job {
这将解释这些注释的意思是......
注释导致行为就像他们的名字形容 - 作业的多个实例将不会被允许同时运行(考虑在某作业守则,它需要34秒运行其execute()方法的情况下,但它计划用触发器,重复每30秒),并且将在每次执行后,调度的作业存储的JobDataMap的内容再坚持。 对于这个例子的目的,只有@PersistJobDataAfterExecution注释是真正相关的,但它总是明智的使用@DisallowConcurrentExecution注释它,以防止保存的数据的比赛条件。
如果你使用的弹簧石英,我认为你必须配置这样
<bean id="batchConsumerJob"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="myScheduler" />
<property name="targetMethod" value="execute" />
<property name="concurrent" value="false" />
</bean>
我不知道你要同步,因为第二个任务将阻塞,直到第一个完成,而且你会积压结束。 你可以把作业队列中,但是从你的描述,它听起来就像队列可以无限增长。
我将调查ReadWriteLock中 S,并让同时在运行你的任务设置锁定。 未来的任务可以检查这个锁,并立即退出,如果旧的任务仍在运行。 我从经验中发现,这是解决这个最可靠的方式。
也许发出警示,以及让你知道你遇到的问题,并相应增加的时间间隔?
把它们放在一个队列
即使时间超过20时的第二电流工作应该完成与再接下来应该从队列中取出。
或者你也可以增加时间,一些合理的量。
您可以使用一个信号量。 当拍摄的旗语,放弃第二个作业,等待下一次的发射时间。