在Quartz.Net中调度多个作业

ldfqzlk8  于 2022-11-26  发布在  .NET
关注(0)|答案(4)|浏览(195)

我是Quartz.Net的初学者。如何在调度程序中添加多个作业?
为了学习,我使用控制台应用程序。

8zzbczxx

8zzbczxx1#

如果您是Quartz .NET的新手,我建议您从Jay Vilalta的Blog和旧的one开始,在那里您可以找到大量关于Quartz .NET的教程和有用的信息。
如果要在控制台应用程序中调度多个作业,只需调用Scheduler.ScheduleJobISscheduler),传递作业和先前创建的触发器:

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

2o7dmzc52#

我使用这个解决方案:

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

8yoxcaq7

8yoxcaq73#

您要完成的任务非常简单:

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

inn6fuwd4#

如果要动态添加作业和触发器,可以尝试以下代码。
“使用石英;

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

`

相关问题