【问题标题】:Quartz: Why does this Trigger not fire?Quartz:为什么这个触发器不触发?
【发布时间】:2013-06-26 08:34:21
【问题描述】:

我在我的项目中使用quartz.NET。我有以下问题。我想每天在 23 点运行计划任务,我正在使用此代码来执行此操作:

public class HelloJob : IJob
{
    public void Execute(IJobExecutionContext context)
    {
        //Download file
    }
}
public interface ISchedule
{
    void Run();
}

public class HelloSchedule : ISchedule
{
    public void Run()
    {

        IJobDetail job = JobBuilder.Create<HelloJob>()
                                   .WithIdentity("job1")
                                   .Build();

        ITrigger trigger = TriggerBuilder.Create()
                                         .ForJob(job)
                                         .WithIdentity("trigger1")
                                         .StartNow()
                                         .WithCronSchedule("0 0 23 ? * MON-FRI *")
                                         .Build();

        ISchedulerFactory sf = new StdSchedulerFactory();
        IScheduler sc = sf.GetScheduler();
        sc.ScheduleJob(job, trigger);

        sc.Start();
    }
}

但不幸的是它没有触发。 我怎样才能知道问题所在并解决它?
感谢您的建议

【问题讨论】:

  • 看起来不错。您可能需要启用日志记录并查看日志文件。此外,如果这是一个网站,请确保它不会因为闲置而关闭。
  • 谢谢,这是winApp。

标签: quartz-scheduler quartz.net


【解决方案1】:

您的工作将在晚上 11 点解雇。
您可以使用以下代码检查您的工作的下一个触发时间:

private static DateTime getNextFireTimeForJob(IScheduler scheduler, string jobName, string groupName = "")
    {
        JobKey jobKey = null;

        if (!string.IsNullOrEmpty(groupName))
        {
            jobKey = new JobKey(jobName, groupName);
        }
        else
        {
            jobKey = new JobKey(jobName);
        }

        DateTime nextFireTime = DateTime.MinValue;

        bool isJobExisting = Scheduler.CheckExists(jobKey);
        if (isJobExisting)
        {
            var detail = scheduler.GetJobDetail(jobKey);
            var triggers = scheduler.GetTriggersOfJob(jobKey);

            var myTrigger = triggers.Where(f => f.Key.Name == "SecondTrigger").SingleOrDefault();


            if (triggers.Count > 0)
            {
                var nextFireTimeUtc = triggers[0].GetNextFireTimeUtc();
                nextFireTime = TimeZone.CurrentTimeZone.ToLocalTime(nextFireTimeUtc.Value.DateTime);
            }
        }

        return (nextFireTime);
    }

并使用此获取信息:

var nextFireTime = getNextFireTimeForJob(sc, "job1");

确保您的 HelloJob 实现 IJob

如果您将 Quartz.net 调度程序集成到 WinApp 中,请确保它是单独创建的,因为它可能会在超出范围时被销毁。

我在控制台应用程序中测试我的作业并使用Console.ReadLine(); 等待作业执行。

【讨论】:

  • 我已经更新了我的答案。向我们提供有关您的 winApp 的更多信息。
  • 我的应用程序应该在每天晚上 11 点运行并执行特定任务(任务是在互联网上下载以 Execute 方法运行的文件)
  • 考虑使用某种日志系统nLog
  • 日志会很有帮助,因为您的 cron 表达式似乎没问题,并且根据this,下一次触发时间将在晚上 11 点进行
  • 我收到此错误:“System.Collections.Generic.IList”不包含“Where”的定义,并且没有扩展方法“Where”接受类型的第一个参数可以找到“System.Collections.Generic.IList”(您是否缺少 using 指令或程序集引用?)
【解决方案2】:

使用org.Quartz 并试试这个:

    JobDetail job = new JobDetail();
    job.setName(Constants.JOB_NAME);
    job.setJobClass(YOUR_JOB_CLASS.class);



    CronTrigger trigger = new CronTrigger();
    trigger.setName(Constants.TRIGGER_NAME);
    trigger.setCronExpression("0 0 23 ? * MON-FRI *");

    // schedule it
    Scheduler scheduler = new StdSchedulerFactory().getScheduler();
    scheduler.start();
    scheduler.scheduleJob(job, trigger);

您的 Job 类应该实现 org.Quartz.Job 接口并覆盖它的 execute 方法,该方法执行作业需要执行的实际操作。

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多