【问题标题】:Can JobDetail records be re-used, and how?JobDetail 记录可以重复使用吗?如何重复使用?
【发布时间】:2012-10-20 05:34:33
【问题描述】:

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

【问题讨论】:

    标签: c# quartz.net


    【解决方案1】:

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

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

    这行得通。

    【讨论】:

    • 酷,我基本上按照布鲁斯在这里所说的做了,它对我有用。
    【解决方案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]);
                }
            }
    

    【讨论】:

    • 以前试过这个。也许它在 Quartz 中有效,但在 Quartz.net 中,GetJobDetail() 有效,但 ScheduleJob() 失败并显示“无法存储作业:无法存储名称为“作业名称 1234”和组:“组名称”的作业,因为这个身份已经存在。”
    • 经过一个月的挣扎后,我现在正在使用这些东西 (Quartz.net)。我会更新我的答案,为您提供更多信息。
    【解决方案3】:

    如果您需要删除 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);
                }
            }
    

    【讨论】:

      【解决方案4】:

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

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

      其他参考:GetJobDetail Method

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-08-06
        • 2015-04-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多