2010-10-09 33 views
8

我有一个计划的作业有每5分钟重复间隔。它工作正常。如何使Quartz.NET进程同步?

但我在我的第一份工作是不是在5分钟完成和第二份工作开始(因为它定于5分钟)的情况。

我不想这样做,只有一个工作应该在同一时间内工作。我怎样才能做到这一点?

这是我的代码:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
IScheduler sched = schedFact.GetScheduler(); 
Trigger emailTrigger = TriggerUtils.MakeMinutelyTrigger(5); 
emailTrigger.StartTimeUtc = TriggerUtils.GetEvenMinuteDate(DateTime.UtcNow); 
emailTrigger.Name = "EmailTrigger"; 
JobDetail emailJobDetail = new JobDetail("EmailJob", null, typeof(EmailJob)); 
sched.ScheduleJob(emailJobDetail, emailTrigger); 
sched.Start(); 

回答

1

我用Quartz.net了一点,但从来没有调查执行工作之间的串行处理。根据我的经验,Quartz更多用于“并行”预定处理,如果作业可能会长时间重叠,所以我不确定它是否支持您需要的处理。

一个简单的解决问题的方法可能是使用可以被任何工作线程(如锁,互斥,信号量或全局布尔等)的访问同步变量。当一个新工作启动时,它应该检查锁,如果它是空闲的,抓住它并且保持它直到它完成。如果另一个工作醒来,并且看到之前的工作仍在运行,则新工作可以退出,并等待调度员在下一个时间间隔再次尝试。你也可以有新的工作等待之前完成,但如果你这样做,你运行的作业堆积如山等待执行的风险,并且该系统从未“恶补”。

+0

它甚至不需要等待;它可以试着抓住同步机制。如果失败了,那么这份工作应该返回它完成并完成。如果它确实抓住它,那么它应该处理。没有“追赶”。当然,它跳过的事实应该被记录下来,并且应该在那个时候重新评估它的时间表。 – casperOne 2011-11-17 13:10:16

30

Quartz.NET 2.x的

实施IJob并与[DisallowConcurrentExecution]属性装饰你的作业类。有关更多信息,请阅读DisallowConcurrentExecutionAttribute的API文档。

Quartz.NET 1.x的

使工作类实现IStatefulJob而非IJob。有关更多信息,请阅读IStatefulJob的API文档。

http://www.quartz-scheduler.net/documentation/faq.html#howtopreventconcurrentfire

+7

还是在Quartz.net 2.0,实现IJob并与'DisallowConcurrentExecution'属性 – Cocowalla 2012-07-14 18:54:32

+0

谢谢,我已经更新了答案 – 2014-01-30 06:16:41

+0

@ neo的装点,请更新正确的答案。 – regisbsb 2015-07-16 09:35:43