石英:为什么这个触发器不会触发?

时间:2013-06-26 08:34:21

标签: quartz-scheduler quartz.net

我在我的项目中使用quartz.NET,我遇到了问题,我想每天23点运行Schedule任务,我正在使用此代码来执行此操作:

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();
    }
}

但遗憾的是它不是火, 我怎么知道问题是什么并解决了?
感谢您的建议

2 个答案:

答案 0 :(得分: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

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

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

答案 1 :(得分:0)

使用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 接口并覆盖其执行方法,该方法执行作业需要执行的实际操作。