在 Quartz.Net 中安排多个作业

问题描述 投票:0回答:5

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

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

.net quartz.net
5个回答
12
投票

如果您是 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);

您可以在此处下载工作示例。

更新:

如果您想暂停和/或重新启动作业,您可以使用

PauseJob
ResumeJob
(您可以使用
PauseTrigger
ResumeTrigger
对触发器执行相同的操作)。

这是一个示例:

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"));
    }
    }
}

7
投票

我使用这个解决方案:

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


1
投票

你想要完成的事情很简单:

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);

0
投票

如果您想动态添加作业和触发器,您可以尝试以下代码。

` 使用石英;

public Task DoSomething(IScheduler schedule, CancellationToken ct)
{
    var job = JobBuilder.Create<StartTripJob>()
                        .WithIdentity("name", "group")
                        .Build();

    var trigger = TriggerBuilder.Create()
        .WithIdentity("name", "group")
        .StartNow()
        .Build();

    await scheduler.ScheduleJob(job, trigger, ct);
}

`


0
投票

对于 Quartz.AspNetCore 和 AspNetCoreWebApi 项目,在 Program.cs 中添加以下内容:

using Quartz;
...
builder.Services.AddQuartz(q =>
{
    var jobKey1 = new JobKey("ContractUpdaterJob");
    q.AddJob<ContractUpdaterJob>(opts => opts.WithIdentity(jobKey1));
    q.AddTrigger(opts => opts
        .ForJob(jobKey1)
        .WithIdentity("ContractUpdaterJob-trigger")
        .WithCronSchedule("0 0 12-19 * * ?")
    );

    var jobKey2 = new JobKey("SpaceMaintenanceJob");
    q.AddJob<SpaceMaintenanceJob>(opts => opts.WithIdentity(jobKey2));
    q.AddTrigger(opts => opts
        .ForJob(jobKey2)
        .WithIdentity("SpaceMaintenanceJob-trigger")
        .WithCronSchedule("0 0 10 * * ?")
    );

});
© www.soinside.com 2019 - 2024. All rights reserved.