结束后如何重新开始工作?

时间:2015-08-08 10:35:26

标签: c# quartz-scheduler quartz.net

我正在使用Quartz.Net库。我写了一些触发器:

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配置文件来为它设置最大线程。

3 个答案:

答案 0 :(得分:2)

将最大线程数设置为50:

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

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

答案 1 :(得分:1)

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

quartz.threadPool.threadCount = 3

Configuration部分了解详情。

@stuartd为您的问题here提供答案 接受他的回答,然后更改触发器以使用StartNow方法:

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

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

答案 2 :(得分:0)

比起初看起来容易得多:

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

在listiner中实现方法:

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