我有一个项目,我使用 TopShelf
和 TopShelf.Quartz
正在关注 this example我正在建立我的工作
s.ScheduleQuartzJob(q =>
q.WithJob(() => JobBuilder.Create<MyJob>().Build())
.AddTrigger(() => TriggerBuilder.Create()
.WithSimpleSchedule(builder => builder
.WithIntervalInSeconds(5)
.RepeatForever())
.Build())
);
即使前一个仍在运行,它也会每五秒触发一次我的工作。我真正想要实现的是开始一份工作,完成后等待五秒钟,然后重新开始。这是可能的还是我必须实现自己的逻辑(例如通过静态变量)。
最佳答案
@NateKerkhofs 提议的作业监听器将起作用,如下所示:
public class RepeatAfterCompletionJobListener : IJobListener
{
private readonly TimeSpan interval;
public RepeatAfterCompletionJobListener(TimeSpan interval)
{
this.interval = interval;
}
public void JobExecutionVetoed(IJobExecutionContext context)
{
}
public void JobToBeExecuted(IJobExecutionContext context)
{
}
public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
{
string triggerKey = context.JobDetail.Key.Name + ".trigger";
var trigger = TriggerBuilder.Create()
.WithIdentity(triggerKey)
.StartAt(new DateTimeOffset(DateTime.UtcNow.Add(interval)))
.Build();
context.Scheduler.RescheduleJob(new TriggerKey(triggerKey), trigger);
}
public string Name
{
get
{
return "RepeatAfterCompletionJobListener";
}
}
}
然后将监听器添加到调度器:
var jobKey = "myJobKey";
var schedule = new StdSchedulerFactory().GetScheduler();
listener = new
RepeatAfterCompletionJobListener(TimeSpan.FromSeconds(5));
schedule.ListenerManager.AddJobListener
(listener, KeyMatcher<JobKey>.KeyEquals(new JobKey(jobKey)));
var job = JobBuilder.Create(MyJob)
.WithIdentity(jobKey)
.Build();
// Schedule the job to start in 5 seconds to give the service time to initialise
var trigger = TriggerBuilder.Create()
.WithIdentity(CreateTriggerKey(jobKey))
.StartAt(DateTimeOffset.Now.AddSeconds(5))
.Build();
schedule.ScheduleJob(job, trigger);
不幸的是,我不知道如何使用 Typshelf.Quartz 库使用的流畅语法来做到这一点(或者是否可以做到),我将其与 TopShelf 和常规 Quartz.Net 一起使用。
关于c# - 如何强制 quartz.net 作业在完成后重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25930384/