2011-03-29 22 views
1

有什么办法可以在数据库中的JobDetail记录上创建新的触发器,但不是在内存中?具体用途:我有计划每天使用cron触发器运行的作业。有时候某一天的工作需要用相同的参数重新运行。我想用相同的JobDetail创建一个新的简单触发器,因为这是存储参数的地方。 Reschedule()不起作用,因为它删除了现有的触发器。那可能吗?可以重复使用JobDetail记录,以及如何?

回答

2

是的,你可以。

我会做的是从数据库中抓取工作:

var myJob = Scheduler.GetJobDetail(jobName, groupName); 

和使用(这很可能你已经使用)的功能

Scheduler.ScheduleJob(JobDetail jobDetail, Trigger trigger); 

通过你的新的触发。 您不必做太多的事情,因为运行时间会在几秒钟后从数据库中获取新触发器并运行它。

UPDATE

有两种方式来添加触发器与Quartz.net

1),您可以添加作业,然后触发:

Scheduler.AddJob(jobToSchedule, true); 
Scheduler.ScheduleJob(triggerToSchedule); 

2)你可以安排触发器同时添加一个作业:

Scheduler.ScheduleJob(jobToSchedule, triggerToSchedule); 

如果您尝试添加作业和触发器小号方式:

Scheduler.AddJob(jobToSchedule, true); 
Scheduler.ScheduleJob(jobToSchedule, triggerToSchedule); 

你得到一个例外,警告你的工作已经存在。

我建议你在做任何测试之前清理数据库,因为你可能有一些待处理的作业。你可以找到一个简单的程序来这里清理:

 // unschedule jobs 
     string[] groups = Scheduler.TriggerGroupNames; 
     for (int i = 0; i < groups.Length; i++) 
     { 
      string[] names = Scheduler.GetTriggerNames(groups[i]); 
      for (int j = 0; j < names.Length; j++) 
      { 
       Scheduler.UnscheduleJob(names[j], groups[i]); 
      } 
     } 

     // delete jobs 
     groups = Scheduler.JobGroupNames; 
     for (int i = 0; i < groups.Length; i++) 
     { 
      string[] names = Scheduler.GetJobNames(groups[i]); 
      for (int j = 0; j < names.Length; j++) 
      { 
       Scheduler.DeleteJob(names[j], groups[i]); 
      } 
     } 
+1

品尝过。也许它在Quartz中有效,但是在Quartz.net中,GetJobDetail()可以工作,但是ScheduleJob()失败,出现“无法存储作业:无法存储名称为Job'的作业:'作业名称1234'和组:'Group Name',因为已经有了这个身份证明。“ – 2011-03-31 16:56:55

+0

我现在正在使用这个东西(石英。净)在一个月的挣扎之后。我会更新我的答案,为您提供更多信息。 – LeftyX 2011-04-01 15:40:31

2

在Quartz.net,我不得不做不同这一点:

Trigger trigger = new SimpleTrigger(triggerName, triggerGroup, newDateTime); trigger.JobName = jobName; trigger.GroupName = jobGroup; Scheduler.ScheduleJob(trigger);

这工作。

+0

酷,我基本上做了布鲁斯在这里说,它为我工作。 – jpierson 2015-04-13 15:40:39

0

对于QuartzNetScheduler.GetJobDetail(jobName, groupName)不可用。 而是使用:

ISchedulerFactory schedFact = new StdSchedulerFactory(); 
    IScheduler sched = schedFact.GetScheduler(); 
    sched.Start(); 
    sched.GetJobDetail(new JobKey("job1", "group1")); 

附加参考:GetJobDetail Method

0

如果您需要删除所有工作/触发器在Quartz.Net 2.0 - 这会为你做它:

 var groups = _scheduler.GetJobGroupNames().ToList(); 

     foreach (var group in groups) 
     { 
      var jobKeys = _scheduler.GetJobKeys(GroupMatcher<JobKey>.GroupEquals(group)).ToList(); 

      foreach (var jobKey in jobKeys) 
      { 
       _scheduler.DeleteJob(jobKey); 
      } 
     } 
相关问题