0

我在我的项目中使用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();
    }
}

但不幸的是,它没有开火。我怎样才能知道问题是什么并解决它?
谢谢你的建议

4

2 回答 2

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();等待作业执行。

于 2013-06-26T11:18:25.610 回答
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接口并覆盖它的 execute 方法,该方法执行作业需要执行的实际操作。

于 2013-06-26T08:58:44.967 回答