C# JobDetail记录可以重复使用吗?如何重复使用?

C# JobDetail记录可以重复使用吗?如何重复使用?,c#,quartz.net,C#,Quartz.net,有没有办法在数据库中但不在内存中的JobDetail记录上创建新触发器?特定用途:我计划每天使用cron触发器运行作业。有时,某一天的作业需要使用相同的参数重新运行。我想使用相同的JobDetail创建一个新的简单触发器,因为参数存储在这里。Reschedule()不起作用,因为它删除了现有触发器。那可能吗?是的,你可以 我要做的是从数据库中获取作业: var myJob = Scheduler.GetJobDetail(jobName, groupName); 并使用该函数(可能您已经使用过

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

是的,你可以

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

var myJob = Scheduler.GetJobDetail(jobName, groupName);
并使用该函数(可能您已经使用过)

通过你的新扳机。 您不必做太多,因为运行时将在几秒钟后从DB获取新触发器并运行它

更新

使用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]);
            }
        }
//计划外作业
string[]groups=Scheduler.TriggerGroupNames;
对于(int i=0;i
是的,你可以

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

var myJob = Scheduler.GetJobDetail(jobName, groupName);
并使用该函数(可能您已经使用过)

通过你的新扳机。 您不必做太多,因为运行时将在几秒钟后从DB获取新触发器并运行它

更新

使用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]);
            }
        }
//计划外作业
string[]groups=Scheduler.TriggerGroupNames;
对于(int i=0;i
在Quartz.net中,我不得不做一些不同的事情:

Trigger Trigger=new SimpleTrigger(triggerName、triggerGroup、newDateTime);
trigger.JobName=JobName;
trigger.GroupName=作业组;
ScheduleJob(触发器)


成功了

在Quartz.net中,我不得不做一些不同的事情:

Trigger Trigger=new SimpleTrigger(triggerName、triggerGroup、newDateTime);
trigger.JobName=JobName;
trigger.GroupName=作业组;
ScheduleJob(触发器)

成功了

对于,
调度程序。GetJobDetail(jobName,groupName)
不可用。 而是使用:

    ISchedulerFactory schedFact = new StdSchedulerFactory();
    IScheduler sched = schedFact.GetScheduler();
    sched.Start();
    sched.GetJobDetail(new JobKey("job1", "group1"));
附加参考:

对于,
调度程序。GetJobDetail(jobName,groupName)
不可用。 而是使用:

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

其他参考资料:

如果您需要删除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);
            }
        }
var groups=\u调度程序.GetJobGroupNames().ToList();
foreach(组中的var组)
{
var jobKeys=_scheduler.GetJobKeys(GroupMatcher.GroupEquals(group)).ToList();
foreach(jobKey中的var jobKey)
{
_scheduler.DeleteJob(jobKey);
}
}

如果您需要删除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);
            }
        }
var groups=\u调度程序.GetJobGroupNames().ToList();
foreach(组中的var组)
{
var jobKeys=_scheduler.GetJobKeys(GroupMatcher.GroupEquals(group)).ToList();
foreach(jobKey中的var jobKey)
{
_scheduler.DeleteJob(jobKey);
}
}

以前试过这个。也许它在Quartz中可以工作,但在Quartz.net中,GetJobDetail()可以工作,但是ScheduleJob()失败了,因为“无法存储作业:无法存储名为:'job name 1234'和组名为:'group name'的作业,因为已经存在一个具有此标识的作业。”经过一个月的努力,我现在正在处理这个东西(Quartz.net)。我将更新我的答案以提供更多信息。以前尝试过这个。也许它在Quartz中可以工作,但在Quartz.net中,GetJobDetail()可以工作,但是ScheduleJob()失败了,因为“无法存储作业:无法存储名为:'job name 1234'和组名为:'group name'的作业,因为已经存在一个具有此标识的作业。”经过一个月的努力,我现在正在处理这个东西(Quartz.net)。我会更新我的答案,给你更多的信息。酷,我基本上按照Bruce在这里说的那样做了,它为我工作