Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/google-sheets/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Quartz:调试不需要的多个作业运行_C#_Quartz Scheduler_Jobs_Quartz.net - Fatal编程技术网

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

C# Quartz:调试不需要的多个作业运行,c#,quartz-scheduler,jobs,quartz.net,C#,Quartz Scheduler,Jobs,Quartz.net,正在将作业安排在应用程序_Start()上: var y=JobBuilder.Create() .WithIdentity(“YY”) .Build(); ITrigger z=TriggerBuilder.Create() .WithDescription(“运行”) .WithDailyTimeIntervalsSchedule(x=>x .间隔时间(24小时) .每天一次 .StartingDailyAt(每天的时间、小时和分钟(9,30)) .InTimeZone(时区信息Utc))

正在将作业安排在应用程序_Start()上:

var y=JobBuilder.Create()
.WithIdentity(“YY”)
.Build();
ITrigger z=TriggerBuilder.Create()
.WithDescription(“运行”)
.WithDailyTimeIntervalsSchedule(x=>x
.间隔时间(24小时)
.每天一次
.StartingDailyAt(每天的时间、小时和分钟(9,30))
.InTimeZone(时区信息Utc))
.Build();
ScheduleJob(y,z);
在作业中,我在开始时记录“作业已启动”。 作业在过去几天内正常运行,但从过去2天开始,我可以在日志中看到“作业已启动”发生了3次,相差几毫秒。添加到作业中的通知邮件程序也会发生同样的情况

我怀疑这是由于指令失火造成的,但是否有任何方法可以调试和确定问题的原因,并确保只执行一个作业实例


此作业的执行时间为1-1.5小时,可能在触发作业时发生了服务器重启和部署。这可能会影响触发场景。

虽然不能直接解决多个作业同时运行的问题,但有一些方法可以防止或至少缓解多个作业同时运行的问题

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


请注意,由于这些作业的接近性,可能存在竞争条件,在极少数情况下仍然会导致双重作业执行

这样定义你的工作:

[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();

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

我认为实际发生的是,这个特定的代码在短时间内连续运行了多次。我不认为这是石英问题。触发此代码的代码更有可能运行多次。您使用的是哪个版本的Quartz?Quartz版本是2.2.2,由于调度程序驻留在应用程序_Start()中,我不太确定它是否可以运行多次。还有其他作业(运行时间不长),它们以相同的方式安排,并且运行良好。我遇到了这样的问题,这是由于复制粘贴造成的。当我们添加新作业时,复制了现有作业定义块,并更改了除触发作业以外的所有内容,因此新触发器正在启动现有作业。确保你的问题不是这样的!
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();