2015-01-09 57 views
1

我正在使用Quartz.net來運行這個工作。我無法找到一種方法來跳過當前的觸發器並等待下一次着火時間。Quartz.net - 如何跳至next_fire_time?

我想每天在凌晨3點到6點運行我的工作。但是如果在上午6點之前獲得我想要的狀態,我想停止跑步並等待第二天。

這是我嘗試但不起作用的代碼。任何想法如何解決它?

計劃

 IScheduler scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
     scheduler.Start(); 

     IJobDetail myjob = JobBuilder.Create<MyJob>() 
        .WithIdentity("MyJob") 
        .Build(); 

     ITrigger myTrigger = TriggerBuilder.Create() 
      .WithIdentity("MyTrigger") 
      .WithDailyTimeIntervalSchedule(
         x => x.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(3, 00)) 
        .EndingDailyAt(TimeOfDay.HourMinuteAndSecondOfDay(6, 00, 00))       
        .WithIntervalInSeconds(10))     
      .Build(); 


     scheduler.ScheduleJob(myjob , myTrigger); 

MyJob

public class MyJob: IInterruptableJob { 

    static int i=0; 

    public void Execute(IJobExecutionContext context) { 

     Console.WriteLine("Call WebService to get the status"); 

     i++; //Just to simulate the status 
     if (i > 5) { //Here, I got the status so stop the timer and run at next-fire-time 

      ITrigger myTrigger = TriggerBuilder.Create() 
      .WithIdentity("MyTrigger") 
      .WithDailyTimeIntervalSchedule(
         x => x.StartingDailyAt(TimeOfDay.HourAndMinuteOfDay(3, 00)) 
        .EndingDailyAt(TimeOfDay.HourMinuteAndSecondOfDay(6, 00, 00))       
        .WithIntervalInSeconds(10))     
      .Build(); 


      context.Scheduler.RescheduleJob(context.Trigger.Key, myTrigger); 
     } 

    public void Interrupt() { 
     Console.WriteLine("Interrupt from MyJOb!"); 
    } 
} 
+0

您可以調用web服務來獲取作業代碼中的狀態 – DLeh

+0

對不起。如果你注意到在MyJob中,有一個代碼「if(i> 5)」和「Console.WriteLine(」Call WebService to get the status「);」所以我已經在調用該服務。問題是如何阻止它,因爲它會運行到停止時間。當我獲得正確的狀態時我想停止工作,並且我希望調度程序等待下一個時間表。 –

回答

0

我找到了解決辦法。

我不能在MyJob類的下面使用這段代碼。

context.Scheduler.RescheduleJob(context.Trigger.Key, myTrigger); 

所以,我必須要改變它這樣的..

var scheduler = StdSchedulerFactory.GetDefaultScheduler(); 
    scheduler.RescheduleJob(context.Trigger.Key, aastarPreLoadTrigger); 

但不幸的是,對於異步/ AWAIT不支持..

注:

我的新代碼修復了重新調度問題,但並沒有停止,所以我認爲我需要簡單的調度程序而不是每日計時器,並將開始日期設置爲第二天。