可以重新使用JobDetail记录吗?

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

在Quartz.net中,我必须做一点不同的事情:

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

那很有效。

是的你可以。

我要做的是从数据库中获取作业:

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

并使用该function(可能你已经使用过)

 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]); } } 

如果您需要删除Quartz.Net 2.0中的所有作业/触发器 – 这将为您完成:

  var groups = _scheduler.GetJobGroupNames().ToList(); foreach (var group in groups) { var jobKeys = _scheduler.GetJobKeys(GroupMatcher.GroupEquals(group)).ToList(); foreach (var jobKey in jobKeys) { _scheduler.DeleteJob(jobKey); } } 

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

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

附加参考: GetJobDetail方法