2

我正在尝试在 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);

还是行不通。

同样的问题。

4

2 回答 2

3

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

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

With the cronschedule you don't need to specify reapeatforever but personally I prefer using the simple schedule where possible as it is a lot more readable.

于 2013-09-13T10:11:52.400 回答
1

我有一个类似的问题。替换符号:

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

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

private static scheduler _scheduler;
...
_scheduler.Start();
于 2012-11-20T09:16:08.830 回答