【问题标题】:Quartz.NET trigger not firingQuartz.NET 触发器未触发
【发布时间】:2009-03-25 06:49:16
【问题描述】:

我在我的 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 中使用它。这不起作用,这就是为什么我将其移至按钮单击处理程序以缩小问题范围。

【问题讨论】:

    标签: asp.net automation scheduling quartz.net


    【解决方案1】:

    你有连接 Quartz.NET 日志吗?我曾经遇到过无法执行作业的问题(我忘记了原因),但是一旦我启动了 Quartz.NET 日志记录,问题就很明显了。

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

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

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

    【讨论】:

    • 这帮助我找到了问题,我的问题是我的工作正在执行的类没有默认(无参数)公共构造函数。
    【解决方案2】:

    也许是时间问题。

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

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

    【讨论】:

    • 非常感谢!那是我的石英设置不起作用的问题。我只是做了类似的事情:DateTime.Now.ToUniversalTime(),它工作正常。
    • 这个问题也让我很痛苦。我在安排作业时一直在使用.StartAt(DateTime.Now.AddMinutes(1))。真正奇怪的是,这曾经完美地工作。
    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      就我而言,IoC 存在问题 - 有一些接口没有实现。我可以通过添加日志来查看我的问题:

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

      按照Andy White的建议发送给Program.cs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多