可以重新使用JobDetail记录吗?

时间:2011-03-29 16:53:21

标签: c# quartz.net

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

4 个答案:

答案 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)

对于QuartzNetScheduler.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);
            }
        }