我正在尝试在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);
仍然无法正常工作。
同样的问题。
答案 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();