正在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小时,并且可能在作业触发时重新启动并部署服务器。这可能会影响触发方案。
答案 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。
请注意,由于这些工作距离较近,可能会出现竞争情况,在极少数情况下仍会导致双重作业执行。