【问题标题】:Schedule multiple jobs in Quartz.Net在 Quartz.Net 中安排多个作业
【发布时间】:2014-02-03 12:47:05
【问题描述】:

我是 Quartz.Net 的初学者。 如何在调度程序中添加多个作业?

为了学习,我正在使用控制台应用程序。

【问题讨论】:

    标签: .net quartz.net


    【解决方案1】:

    如果您是 Quartz.Net 的新手,我建议您从 Jay Vilalta 的 Blog 和旧的 one 开始,在那里您可以找到有关 Quartz.Net 的大量教程和有用信息。

    如果您想在控制台应用程序中安排多个作业,只需调用 Scheduler.ScheduleJob (IScheduler) 传递作业和您之前创建的触发器:

    IJobDetail firstJob = JobBuilder.Create<FirstJob>()
                   .WithIdentity("firstJob")
                   .Build();
    
    ITrigger firstTrigger = TriggerBuilder.Create()
                     .WithIdentity("firstTrigger")
                     .StartNow()
                     .WithCronSchedule("0 * 8-22 * * ?")
                     .Build();
    
    
    IJobDetail secondJob = JobBuilder.Create<SecondJob>()
                   .WithIdentity("secondJob")
                   .Build();
    
    ITrigger secondTrigger = TriggerBuilder.Create()
                     .WithIdentity("secondTrigger")
                     .StartNow()
                     .WithCronSchedule("0 0/2 * 1/1 * ? *")
                     .Build();
    
    Scheduler.ScheduleJob(firstJob, firstTrigger);
    Scheduler.ScheduleJob(secondJob, secondTrigger);
    

    您可以下载一个工作示例here

    更新:

    如果您想暂停和/或重新启动作业,您可以使用PauseJobResumeJob(您可以使用PauseTriggerResumeTrigger 对触发器执行相同的操作)。

    这是一个示例:

    private static void Test001(IScheduler Scheduler)
    {
        IJobDetail firstJob = JobBuilder.Create<FirstJob>()
                       .WithIdentity("firstJob")
                       .Build();
    
        ITrigger firstTrigger = TriggerBuilder.Create()
                         .WithIdentity("firstTrigger")
                         .StartNow()
                         .WithSimpleSchedule(x => x.WithIntervalInSeconds(1).RepeatForever())
                         .Build();
    
    
        IJobDetail secondJob = JobBuilder.Create<SecondJob>()
                       .WithIdentity("secondJob")
                       .Build();
    
        ITrigger secondTrigger = TriggerBuilder.Create()
                         .WithIdentity("secondTrigger")
                         .StartNow()
                         .WithSimpleSchedule(x=>x.WithIntervalInSeconds(1).RepeatForever())
                         .Build();
    
    
        Scheduler.ScheduleJob(firstJob, firstTrigger);
        Scheduler.ScheduleJob(secondJob, secondTrigger);
    
        for (int i = 0; i < 300; i++)
        {
        System.Threading.Thread.Sleep(100);
        if (i == 100)
        {
            Scheduler.PauseJob(new JobKey("firstJob"));
        }
        else if (i == 200)
        {
            Scheduler.ResumeJob(new JobKey("firstJob"));
        }
        }
    }
    

    【讨论】:

    • 你能告诉我另一件事吗?假设我有两个以相同间隔运行的作业。那么我可以暂停任何一项工作并让它运行吗?
    • 很高兴我能帮上忙。我已经用更多信息更新了我的答案。看看PauseJobResumeJob。干杯。
    • 感谢您的快速回复。但是上面的代码不能满足我的要求。我有一个场景,我假设两个作业以相似的时间间隔运行,让它为 30 秒。然后假设一个作业由于某种原因在 15 秒处突然暂停,而另一个作业继续运行。现在我希望在恢复后,第一份工作应该从 16 秒开始,即它离开的地方。 Misfire 会有帮助吗?
    • 这个“0 * 8-22 * *”是什么意思?和“0 0/2 * 1/1 * ? *”
    • @Mou: 那是cron expressoin。您可以检查该表达式的结果here
    【解决方案2】:

    我使用这个解决方案:

    IJobDetail jobDetail = JobBuilder
        .Create<ReportJob>()
        .WithIdentity("theJob")
        .Build();
    
    ITrigger everydayTrigger = TriggerBuilder
        .Create()
        .WithIdentity("everydayTrigger")
        // fires 
        .WithCronSchedule("0 0 12 1/1 * ?")
        // start immediately
        .StartAt(DateBuilder.DateOf(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year))
        .Build();
    ITrigger yearlyTrigger = TriggerBuilder.Create()
        .WithIdentity("yearlyTrigger")
        // fires 
        .WithCronSchedule("0 0 12 1 1 ? *")
        // start immediately
        .StartAt(DateBuilder.DateOf(DateTime.Now.Hour, DateTime.Now.Minute, DateTime.Now.Second, DateTime.Now.Day, DateTime.Now.Month, DateTime.Now.Year))
        .Build();
    
    var dictionary = new Dictionary<IJobDetail, Quartz.Collection.ISet<ITrigger>>();
    dictionary.Add(jobDetail, new Quartz.Collection.HashSet<ITrigger>()
                              {
                                  everydayTrigger,
                                  yearlyTrigger
                              });
    sched.ScheduleJobs(dictionary, true);
    

    来自:https://stackoverflow.com/a/20419575/1676736

    【讨论】:

      【解决方案3】:

      你想要完成的很简单:

      ISchedulerFactory schFactory = new StdSchedulerFactory();
      IScheduler sch = schFactory.GetScheduler();
      
      sch.Start();
      
      //Repeat the code below for as many jobs you'd like
      //creating jobs and triggers for them. 
      //If they fire at the same time, just one ITrigger is needed .....
      IJobDetail job = JobBuilder.Create<HelloJob>()
          .WithIdentity("myJob", null)
          .Build();
      
      ITrigger trigger = TriggerBuilder
                       .Create()
                       .WithSchedule(SimpleScheduleBuilder.RepeatMinutelyForever())
                       .ForJob(job)
                       .WithIdentity(job.Key.Name + "Trigger")
                       .Build();
      
      sch.AddJob(trigger);
      

      【讨论】:

      • 它不起作用。我在第二份工作中遇到异常,因为“触发器没有引用给定的工作”。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多