Quartz.NET触发器没有触发

时间:2009-03-25 06:49:16

标签: asp.net automation scheduling quartz.net

我在ASP.NET Web应用程序中使用Quartz.NET。我将以下代码放在按钮单击处理程序中以确保它执行(用于测试目的):

Quartz.ISchedulerFactory factory = new Quartz.Impl.StdSchedulerFactory();
Quartz.IScheduler scheduler = factory.GetScheduler();
Quartz.JobDetail job = new Quartz.JobDetail("job", null, typeof(BackupJob));
Quartz.Trigger trigger = Quartz.TriggerUtils.MakeDailyTrigger(8, 30); // i edit this each time before compilation (for testing purposes)
trigger.StartTimeUtc = Quartz.TriggerUtils.GetEvenSecondDate(DateTime.UtcNow);
trigger.Name = "trigger";
scheduler.ScheduleJob(job, trigger);
scheduler.Start();

这里是“BackupJob”:

public class BackupJob : IJob
{
    public BackupJob()
    {
    }

    public void Execute(JobExecutionContext context)
    {
        NSG.BackupJobStart();
    }
}

我的问题:为什么“BackupJobStart()”没有解雇?我以前使用过类似的代码而且运行正常。

编辑:@Andy White,我会在Global.asax的Application_Start中使用它。这不起作用,这就是为什么我把它移动到一个按钮点击处理程序来缩小问题范围。

4 个答案:

答案 0 :(得分:5)

您是否已连接Quartz.NET日志记录?我曾经遇到过一个没有执行的工作的问题(我忘记了原因),但是一旦我开始使用Quartz.NET,问题就显而易见了。

值得一试(如果你还没有这样做):

更新:只需将其添加到program.cs以启用控制台日志记录:

Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info};

答案 1 :(得分:3)

也许这是时间问题。

我和你有同样的问题,我住的是一个时间为UTC + 2的国家。所以,当我将StartTimeUtc设置为触发器时,我使用了DateTime.Now,所以触发器没有直到两个小时后开火,我认为必须在我的代码开始的那一刻被解雇。

仔细查看触发器执行的时间及其StartTime

答案 2 :(得分:1)

另一种可能性是您运行调度程序的方式。我不完全确定,但是在尝试在ASP.NET应用程序中运行调度线程时可能会遇到问题。将SchedulerFactory / Scheduler对象放在按钮单击处理程序中似乎不会给您带来所需的结果。

您可能需要在更“全局”级别创建调度程序,以便它可以在应用程序的“后台”中运行。将任何计划的工作移动到单独的Windows服务中也是有意义的,这样您就不必在Web应用程序中维护计划程序。

过去成功的时候,你是如何调用调度程序的?

答案 3 :(得分:0)

就我而言,IoC存在问题-有些接口尚未实现。通过添加日志记录,我可以看到我的问题所在:

Common.Logging.LogManager.Adapter = new Common.Logging.Simple.ConsoleOutLoggerFactoryAdapter { Level = Common.Logging.LogLevel.Info};

{p>到Andy White建议的Program.cs