2013-06-26 2 views
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(); 
    } 
} 

, но, к сожалению, это не fire, Как я могу узнать, в чем проблема и решить эту проблему?
Благодаря вашей Advise

+1

Выглядит нормально. Возможно, вам потребуется включить ведение журнала и просмотреть файлы журнала. Кроме того, если это веб-сайт, убедитесь, что он не отключается из-за простоя. – sgmoore

+0

спасибо, это winApp. –

ответ

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, убедитесь, что он создан singleton, потому что он может быть уничтожен, когда он выходит за рамки.

Я тестирую свои задания в консольном приложении и использую Console.ReadLine();, чтобы ждать выполнения заданий.

+0

спасибо, но доза не горит в 11 часов вечера. где моя проблема? –

+0

Я обновил свой ответ. Дайте нам больше информации о вашем winApp. – LeftyX

+0

мое приложение должно работать каждый день в 11 вечера и выполнять определенную задачу (задача - загрузить файл в Интернете, который выполняется в методе Execute) –

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

Ваш класс работы должны осуществлять org.Quartz.Job интерфейс и переопределить его метод выполнения, который делает фактическую вещь работу необходимо выполнить.