【发布时间】:2012-10-20 05:34:33
【问题描述】:
有没有办法在数据库中但不在内存中的 JobDetail 记录上创建新触发器?具体用途:我安排了使用 cron 触发器每天运行的作业。有时需要使用相同的参数重新运行特定一天的作业。我想使用相同的 JobDetail 创建一个新的简单触发器,因为这是存储参数的地方。 Reschedule() 不起作用,因为它删除了现有的触发器。这可能吗?
【问题讨论】:
标签: c# quartz.net
有没有办法在数据库中但不在内存中的 JobDetail 记录上创建新触发器?具体用途:我安排了使用 cron 触发器每天运行的作业。有时需要使用相同的参数重新运行特定一天的作业。我想使用相同的 JobDetail 创建一个新的简单触发器,因为这是存储参数的地方。 Reschedule() 不起作用,因为它删除了现有的触发器。这可能吗?
【问题讨论】:
标签: c# quartz.net
在 Quartz.net 中,我必须做一些不同的事情:
Trigger trigger = new SimpleTrigger(triggerName, triggerGroup, newDateTime);
trigger.JobName = jobName;
trigger.GroupName = jobGroup;
Scheduler.ScheduleJob(trigger);
这行得通。
【讨论】:
是的,你可以。
我要做的是从数据库中获取作业:
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]);
}
}
【讨论】:
如果您需要删除 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);
}
}
【讨论】:
对于QuartzNet,Scheduler.GetJobDetail(jobName, groupName) 不可用。
而是使用:
ISchedulerFactory schedFact = new StdSchedulerFactory();
IScheduler sched = schedFact.GetScheduler();
sched.Start();
sched.GetJobDetail(new JobKey("job1", "group1"));
其他参考:GetJobDetail Method
【讨论】: