Quartz:调试不需要的多个作业运行

时间:2014-11-28 08:45:13

标签: c# quartz-scheduler jobs quartz.net

正在App_Start()中安排作业:

var y= JobBuilder.Create<YY>()
            .WithIdentity("YY")
            .Build();

ITrigger z= TriggerBuilder.Create()
            .WithDescription("Runs.")
            .WithDailyTimeIntervalSchedule(x => x
            .WithIntervalInHours(24)
            .OnEveryDay()
            .StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(9, 30))
            .InTimeZone(TimeZoneInfo.Utc))
            .Build();

Scheduler.ScheduleJob(y, z);

在工作中,我正在记录&#34;工作开始&#34;在开始。 这项工作在过去的几天里正常运行,但自从过去两天以来,我能够看到&#34;工作开始了#34;在日志中出现3次,差异为几毫秒。添加到作业的通知邮件也会发生同样的情况。

我怀疑它是由于失火指令,但是有没有调试和确定问题原因的方法,还要确保只有1个作业实例被执行。

执行此作业需要1-1.5小时,并且可能在作业触发时重新启动并部署服务器。这可能会影响触发方案。

2 个答案:

答案 0 :(得分:2)

以这种方式定义你的工作:

[DisallowConcurrentExecution]
public class YourJobClass : IJob
{
    //  Your Code...
}

[DisallowConcurrentExecution]属性可以确保在任何时候最多只有一个作业实例。

这只是一个猜测,但如果您的问题是由失火引起的,也许以下代码可以提供帮助:

您可以使用以下代码更改调度程序的属性:

IScheduler scheduler;        
ISchedulerFactory schedulerFactory;
NameValueCollection propColl = new NameValueCollection();

propColl.Add("org.quartz.jobStore.misfireThreshold", "216000000");  // Amount of milliseconds that may pass till a trigger that couldn't start in time counts as misfired (216000000 ms => 1 hour) 
propColl.Add("org.quartz.scheduler.batchTriggerAcquisitionFireAheadTimeWindow", "5"); // Trigger may fire up to 5 ms before scheduled starttime
propColl.Add("quartz.threadPool.threadCount", "1"); // Allows only one Thread in parallel
schedulerFactory = new StdSchedulerFactory(propColl);
scheduler = schedulerFactory.GetScheduler();
scheduler.Start();

关于调试此问题的问题:我个人只知道试错法。改变一点,看看会发生什么。

答案 1 :(得分:0)

虽然它没有直接解决多个作业同时运行的问题,但有一些方法可以防止或至少减轻同时运行的多个作业。

Scheduler有一个方法checkExists()可以接受jobKey或triggerKey,如果作业或触发器已经存在,则返回true。

请注意,由于这些工作距离较近,可能会出现竞争情况,在极少数情况下仍会导致双重作业执行。