如何在作业结束后重新运行作业

本文关键字:作业 重新运行 结束 | 更新日期: 2023-09-27 18:06:54

我用的是Quartz。网络图书馆。我写了一些触发器:

var t = 
   TriggerBuilder.Create()
   .WithIdentity("FirstTask", "TaskGroup")
   .StartAt(DateBuilder.TodayAt(16, 17, 0))
   .EndAt(DateBuilder.TodayAt(17, 17, 0))
   .WithSimpleSchedule(x => x.RepeatForever()
                             .WithIntervalInSeconds(1))
   .Build();

如果我排除.WithIntervalInSeconds(1),我有一个异常,重试时间不能为零。那么,当我的工作完成后,我如何重新启动它呢?另外,我没有找到quartz.net配置文件来为它设置最大线程数

如何在作业结束后重新运行作业

设置最大线程数为50:

var properties = new NameValueCollection { { @"quartz.threadPool.threadCount", @"50" } };
var factory = new StdSchedulerFactory(properties);
var scheduler = schedulerFactory.GetScheduler();

并且不排除WithIntervalInSeconds, Quartz必须知道,何时再次运行

在我之前的工作中,我们将Quartz threadpool配置为如下:

quartz.threadPool.threadCount = 3

详细信息请参见配置部分

@stuartd在这里提供您的问题的答案。
接受他的回答,然后改变触发器使用StartNow方法:

var trigger = TriggerBuilder.Create()
                            .WithIdentity(triggerKey)
                            .startNow()
                            .build();

@SchlaWiener也提供了一个使用TopShelf的很好的解决方案。

比一开始看起来容易多了:

var job = JobBuilder.Create<HelloJob>().WithIdentity(new JobKey("Task_1", "TaskGroup")).Build();
var t = TriggerBuilder.Create()
        .WithIdentity("Trigger_1", "TaskGroup")
        .StartAt(DateBuilder.TodayAt(21, 15, 0))
        .EndAt(DateBuilder.TodayAt(21, 18, 0))
        .Build();
_scheduleService.Scheduler.ScheduleJob(job, t);

和在listener中的实现方法:

public void JobWasExecuted(IJobExecutionContext context, JobExecutionException jobException)
{
    if (DateTime.UtcNow > context.Trigger.EndTimeUtc)
        return;
    context.Scheduler.RescheduleJob(context.Trigger.Key, context.Trigger);
}