有没有办法在JobDetail记录上创建一个新的触发器,该记录在数据库中,但不在内存中?具体用途:我计划每天使用cron触发器运行作业。有时需要使用相同的参数重新运行特定日期的作业。我想使用相同的JobDetail创建一个新的简单触发器,因为那是存储参数的地方。 Reschedule()不起作用,因为它删除了现有的触发器。这可能吗?
答案 0 :(得分:2)
是的,你可以。
我要做的是从数据库中获取作业:
var myJob = Scheduler.GetJobDetail(jobName, groupName);
并使用该功能(可能已经使用过)
Scheduler.ScheduleJob(JobDetail jobDetail, Trigger trigger);
传递新的触发器。 您不需要做太多工作,因为运行时将在几秒钟后从数据库中获取新的触发器并运行它。
更新
有两种方法可以使用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 :(得分:2)
在Quartz.net中,我不得不这样做:
Trigger trigger = new SimpleTrigger(triggerName, triggerGroup, newDateTime);
trigger.JobName = jobName;
trigger.GroupName = jobGroup;
Scheduler.ScheduleJob(trigger);
那很有用。
答案 2 :(得分:0)
对于QuartzNet,Scheduler.GetJobDetail(jobName, groupName)
不可用。
而是使用:
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = schedFact.GetScheduler();
sched.Start();
sched.GetJobDetail(new JobKey("job1", "group1"));
其他参考:GetJobDetail Method
答案 3 :(得分: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);
}
}