2011-03-14 80 views
0

我有以下代码来安排使用Quartz的重新启动作业。该代码为每周的每一天设置触发器(由用户选择)。所以这项工作应该能够每天最多运行一次。但是,当我测试它时,它会连续运行三次而不是一次。有任何想法吗?运行连续三次触发的Quartz.net作业 - 应该只有一次

private void ScheduleJob(Server server) 
{ 
    bool jobScheduled = false; 
    JobDetail job = new JobDetail(server.ServerName, JOB_GROUP, typeof(RebootJob)); 
    job.JobDataMap.Add("Server", server); 
    // Create a trigger for each day of the week on which this schedule falls 
    for(int i=0; i < 7; i++) 
    { 
     DayOfWeek dayOfWeek = (DayOfWeek)i; 
     DateTime? jobStartTime = server.GetNextScheduledRebootDateAndTime(); 
     if(server.isScheduledOnDayOfWeek(dayOfWeek) && jobStartTime.HasValue) 
     { 
      SimpleTrigger trigger = new SimpleTrigger(
       String.Format("{0}.{1}", server.ServerName, dayOfWeek.ToString()), 
       JOB_GROUP, 
       jobStartTime.Value.ToUniversalTime(), 
       null, 
       SimpleTrigger.RepeatIndefinitely, 
       TimeSpan.FromDays(7 * (double)server.RebootFrequency) 
      ); 
      if(!jobScheduled) 
      { 
       ManagementService.Instance.Scheduler.ScheduleJob(job, trigger); 
       jobScheduled = true; 
       // Add server to list of servers with a reboot schedule 
       m_RebootableServers.Add(server.ServerName, server); 
      } 
      else // A job has already been schedule, just append triggers to it 
      { 
       trigger.JobName = job.Name; 
       trigger.JobGroup = job.Group; 
       ManagementService.Instance.Scheduler.ScheduleJob(trigger); 
      } 
     } 
    } 
} 

回答

1

它看起来像你设置每个触发器同时触发并具有相同的间隔。

迭代“i”的“for”循环没有考虑到“server.GetNextScheduledRebootDateAndTime()”始终返回相同的“下一次”重启时间的事实。我猜测你正在测试一台配置为在一周内的3天内重新启动的服务器,并且所有触发器都将设置为在7天的重复时间间隔内同时启动。

如果您设置为使用SimpleTrigger,则需要将触发器的开始时间与您希望计划重新启动的星期几相移。

+0

没错。在服务器对象中有另一个签名为'DateTime? GetNextScheduledRebootDateAndTimeAfter(System.DateTime)',我打算在这里使用。我有点失望,我没有听清楚。谢谢一堆! – Trevor 2011-03-16 18:06:01