2010-10-24 122 views
3

我正在使用Quartz.NET作为我创建的系统,其中作业通过Windows服务运行,并且可以在ASP.NET页面中添加和编辑(包含触发器详细信息)。使用Unschedulejob修改触发器的详细信息 - 我做错了什么? (Quartz.NET)

虽然我有一些问题 - 我需要能够修改触发器的详细信息,例如简单触发器或cronexpression的类型,而且我被告知需要暂时不调度工作,然后重新计划它。问题是,没有计划工作,然后重新安排由于某种原因完全从工作中删除触发器。这里是我在编辑页面点击Submit按钮时的代码:

Trigger[] triggers = sched.GetTriggersOfJob(hdnID.Value, hdnGroupID.Value); 

     if (ddlScheduleType.SelectedIndex == 1) 
     { 
      sched.UnscheduleJob(triggers[0].Name, triggers[0].Group); 
      foreach (SimpleTrigger trigger in triggers.OfType<SimpleTrigger>()) 
      { 
       if (ddlInterval.SelectedIndex == 0) 
       { 
        trigger.RepeatInterval = TimeSpan.Parse("00:00:01"); 
       } 
       else if (ddlInterval.SelectedIndex == 1) 
       { 
        trigger.RepeatInterval = TimeSpan.Parse("00:01:00"); 
       } 
       else if (ddlInterval.SelectedIndex == 2) 
       { 
        trigger.RepeatInterval = TimeSpan.Parse("01:00:00"); 
       } 


       sched.RescheduleJob(trigger.Name, trigger.Group, trigger); 


      } 
     } 

     else 
     { 
      foreach (CronTrigger trigger in triggers.OfType<CronTrigger>()) 
      { 
       trigger.CronExpressionString = txtCron.Text; 
       sched.UnscheduleJob(triggers[0].Name, triggers[0].Group); 
       sched.RescheduleJob(trigger.Name, trigger.Group, trigger); 

      } 


     } 

     sched.AddJob(jobDetail, true); 

任何想法为什么这不起作用?由于

新:

if (ddlScheduleType.SelectedIndex == 1) 

     { 
      foreach (SimpleTrigger trigger in triggers.OfType<SimpleTrigger>()) 
      { 
       Trigger newtrigger = new SimpleTrigger(); 


       if (ddlInterval.SelectedIndex == 0) 
       { 
        newtrigger = TriggerUtils.MakeSecondlyTrigger(); 
       } 
       else if (ddlInterval.SelectedIndex == 1) 
       { 
        newtrigger = TriggerUtils.MakeMinutelyTrigger(); 
       } 
       else if (ddlInterval.SelectedIndex == 2) 
       { 
        newtrigger = TriggerUtils.MakeHourlyTrigger(); 
       } 

       newtrigger.Name = triggers[0].Name; 
       newtrigger.Group = triggers[0].Group; 
       newtrigger.JobName = triggers[0].JobName; 
       newtrigger.JobGroup = triggers[0].JobGroup; 

       sched.RescheduleJob(trigger.Name, trigger.Group, newtrigger); 


      } 
     } 

     else 
     { 
      foreach (CronTrigger trigger in triggers.OfType<CronTrigger>()) 
      { 
       CronTrigger newtrigger2 = new CronTrigger(); 
       newtrigger2.Name = trigger.Name; 
       newtrigger2.Group = trigger.Group; 
       newtrigger2.JobName = trigger.JobName; 
       newtrigger2.JobGroup = trigger.JobGroup; 

       newtrigger2.CronExpressionString = txtCron.Text; 
       sched.RescheduleJob(trigger.Name, trigger.Group, newtrigger2); 

      } 


     } 

回答

2
  • 我怀疑UnscheduleJob是必要的。重新安排应该delete the old trigger,所以尝试没有它
  • else代码没有意义:

    foreach (CronTrigger trigger in triggers.OfType<CronTrigger>()) 
        { 
         trigger.CronExpressionString = txtCron.Text; 
         sched.UnscheduleJob(triggers[0].Name, triggers[0].Group); 
         sched.RescheduleJob(trigger.Name, trigger.Group, trigger); 
        } 
    

    你的意思也许

    foreach (CronTrigger trigger in triggers.OfType<CronTrigger>()) 
        { 
         trigger.CronExpressionString = txtCron.Text; 
         sched.UnscheduleJob(trigger.Name, trigger.Group); //I would remove this 
         sched.RescheduleJob(trigger.Name, trigger.Group, trigger); 
        } 
    
  • 最后,我想尝试用新补赛触发器而不是与旧的修改器

+0

干杯好友,这很好 - 但如果我想改变一个SimpleTrigger到一个CronTrigger它似乎不工作,它只是保留旧的 – Chris 2010-10-25 13:14:59

+0

你可以发布你用来代替SimpleTrigger的代码CronTrigger? – 2010-10-25 13:16:38

+0

刚发布新代码:) – Chris 2010-10-25 13:38:14