我是 Quartz.Net 的初学者。 如何在调度程序中添加多个作业?
为了学习,我正在使用控制台应用程序。
如果您是 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"));
}
}
}
我使用这个解决方案:
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);
你想要完成的事情很简单:
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);
如果您想动态添加作业和触发器,您可以尝试以下代码。
` 使用石英;
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);
}
`
对于 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 * * ?")
);
});