Quartz.NET只执行一次作业

时间:2012-11-20 09:07:37

标签: c# .net wcf quartz.net-2.0

我正在尝试在Quartz.NET 2.0中进行简单的预定作业

我已经读过类似的问题,但它对我来说没有用。

问题是在StartAt触发后,作业只执行一次。

这是我的代码:

public EntityMappingSvc()
{
    IJobDetail job = JobBuilder.Create<EntityMappingJob>().WithIdentity("QueueJob").Build();
    TriggerBuilder tb = TriggerBuilder.Create();
    tb.WithIdentity("StdTrigger");
    tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1));
    tb.StartAt(new DateTimeOffset(new DateTime(2012, 11, 20, 10, 55, 0)));
    tb.ForJob(job);
    ITrigger trigger = tb.Build();
    Global.sched.ScheduleJob(job, trigger);
}

protected void Application_Start(object sender, EventArgs e)
{
    Global.factory = new StdSchedulerFactory();
    Global.sched = Global.factory.GetScheduler();
    Global.sched.Start();

    GC.KeepAlive(factory);
    GC.KeepAlive(sched);
}

这项工作很简单......但是为了测试它,我必须提出一个错误,这个错误被捕获并单独处理,不会影响实际工作。

第一次运行作业后,它会被阻止

while (runnable == null && run)
{
     Monitor.Wait(this, 500);
}
if (runnable != null)
{
     ran = true;
     runnable.Run();
}

在SimpleThreadPool中的Run方法。

有什么建议吗?

PS:该应用程序是WCF IIS托管服务。

编辑:

TriggerBuilder tb = TriggerBuilder.Create();
tb.WithIdentity("StdTrigger");
tb.WithCronSchedule("0 1 * * * ?");
tb.StartAt(new DateTimeOffset(new DateTime(2012, 11, 20, 10, 45, 0)));
tb.ForJob(job);
ICronTrigger trigger = tb.Build() as ICronTrigger;
Global.sched.ScheduleJob(job, trigger);

仍然无法正常工作。

同样的问题。

2 个答案:

答案 0 :(得分:2)

我刚才遇到了同样的问题,你原来的工作只是第一次用简单的时间表运行的原因是你需要指定.RepeatForever()

tb.WithSimpleSchedule(a => a.WithIntervalInMinutes(1).RepeatForever());

使用cronschedule你不需要指定reapeatforever,但我个人更喜欢使用简单的时间表,因为它更具可读性。

答案 1 :(得分:1)

我有类似的问题。替换标记:

GC.KeepAlive(factory);
GC.KeepAlive(sched);

使用简单的静态指针调度程序:

private static scheduler _scheduler;
...
_scheduler.Start();