确保春节石英作业执行不重叠(Ensure that Spring Quartz job execut

2019-09-01 22:32发布

我有一个从春天Qquartz每20秒执行的Java程序。 有时,它只需几秒钟就可以执行,但作为数据变大我敢肯定,它运行20秒以上。

如何防止石英从发射/时,仍执行一个实例触发的工作吗? 射击2个工作在数据库上执行相同的操作就不会这么好。 有没有一种方法,我可以做一些同步?

Answer 1:

如果你需要做的就是火每20秒,石英是严重的矫枉过正。 该java.util.concurrent.ScheduledExecutorService应该是完成此项工作完全足够。

ScheduledExecutorService还提供了两个语义用于调度。 “固定利率”将尝试无论重叠每20秒运行你的工作,而“固定延迟”会试图离开第一份工作的结束和下一个开始之间20秒。 如果你想避免重叠,然后固定延迟是最安全的。



Answer 2:

石英1

如果你改变你的类来实现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

在石英的2.0版本, StatefulJob已被弃用。 现在建议使用注释来代替,如

@DisallowConcurrentExecution
public class YourJob implements org.quartz.Job {
    void execute(JobExecutionContext context) {/*implementation omitted*/}
}


Answer 3:

万一有人引用了这个问题,StatefulJob已被弃用。 他们现在建议你使用注释,而不是...

@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class TestJob implements Job {

这将解释这些注释的意思是......

注释导致行为就像他们的名字形容 - 作业的多个实例将不会被允许同时运行(考虑在某作业守则,它需要34秒运行其execute()方法的情况下,但它计划用触发器,重复每30秒),并且将在每次执行后,调度的作业存储的JobDataMap的内容再坚持。 对于这个例子的目的,只有@PersistJobDataAfterExecution注释是真正相关的,但它总是明智的使用@DisallowConcurrentExecution注释它,以防止保存的数据的比赛条件。



Answer 4:

如果你使用的弹簧石英,我认为你必须配置这样

    <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>


Answer 5:

我不知道你要同步,因为第二个任务将阻塞,直到第一个完成,而且你会积压结束。 你可以把作业队列中,但是从你的描述,它听起来就像队列可以无限增长。

我将调查ReadWriteLock中 S,并让同时在运行你的任务设置锁定。 未来的任务可以检查这个锁,并立即退出,如果旧的任务仍在运行。 我从经验中发现,这是解决这个最可靠的方式。

也许发出警示,以及让你知道你遇到的问题,并相应增加的时间间隔?



Answer 6:

把它们放在一个队列

即使时间超过20时的第二电流工作应该完成与再接下来应该从队列中取出。

或者你也可以增加时间,一些合理的量。



Answer 7:

您可以使用一个信号量。 当拍摄的旗语,放弃第二个作业,等待下一次的发射时间。



文章来源: Ensure that Spring Quartz job execution doesn't overlap