2011-08-11 8 views
15

私は、クォーツCronTrigger機能を使用して、特定のジョブがいつ実行されるべきかを判断するためにcronスケジュールフォーマット文字列を解析しています。私は実際に仕事をスケジュールするために実際にはQuartzを使用していません。クォーツCronTrigger - 次の火災時間の取得

CronTriggerには、getFireTimeAfter(Date)というメソッドがあります。このメソッドは、指定された日付の後にジョブが次に起動される時刻を返します。提供された日付が現在または将来になると、これはうまく動作します。しかし、それは過去の日付であればうまくいかないようです。 3と毎月の18日23:00に発射するのcronスケジュールをある

Date currTime = new Date(); 
CronTrigger tr = new CronTrigger(); 
tr.setCronExpression("0 0 23 3,18 * ? *"); 
Date nextFireAt = tr.getFireTimeAfter(currTime); 
System.out.println("Reference time: " + currTime); 
System.out.println("Next fire after reference time: " + nextFireAt); 

。だから私はこの今日(8月11日)を行った場合、たとえば、私は以下を参照してください。私は過去に基準日を設定している場合

Reference time: Thu Aug 11 10:04:25 MDT 2011 
Next fire after reference time: Thu Aug 18 23:00:00 MDT 2011 

しかし、それは私と同じ次の発射時間を与えます。

Reference time: Wed Dec 31 17:00:00 MST 1969 
Next fire after reference time: Thu Aug 18 23:00:00 MDT 2011 
私は出力があることを期待していた

Reference time: Wed Dec 31 17:00:00 MST 1969 
Next fire after reference time: Wed Aug 3 23:00:00 MDT 2011 

はちょうどそのように動作するか、私は何か間違ったことをやっていることを意図していない方法ですか?

ありがとうございます! Quartz docによると

+1

8月3日は過去です。 – Kal

+0

@Kal - そうだね。私は、たとえそれが過去であっても、与えられた日付の後にトリガがいつ発射されるのかを把握しようとしています。 – cambo

答えて

27

あなたが本当にCronTriggerを直接CronExpressionオブジェクトを使用しないようにしたいどのような。あなたが発見したように、それは過去の次の実行時間を計算しません...しかしCronExpressionは!

CronExpressionにはメソッドgetNextValidTimeAfterがあります。これはあなたが望むものです。

+0

はい!それはまさに私が探しているものです!ありがとう! – cambo

+0

日時範囲内のすべての発生を見つける方法はありますか? –

+0

@ManikArora:whileループでgetNextValidTimeAfterを呼び出し、最初のdatetimeをパラメータとして渡してから、それぞれの繰り返しですべてのタイムスタンプを返すことができ、それらのタイムスタンプがまだ終了時間より短い間にループします。 各繰り返しで、結果の日付を出現のリストに追加できます。 – cvacca

0

は、与えられた時間

後、「将来的には」意味「起動します」、CronTriggerが起動するときの次の時間を返します。つまり、次回にはCronTriggerが発生する時刻は過去ではなく、過去の日付は返されません。

私はあなたがacheieveしようとしているかを正確に知りませんが、あなたは夜これらのメソッドに興味がある

:)(トリガーが

  • getTimeBeforeを解雇された最後の時間を返します:

    • getPreviousFireTime() :指定した日付より前に発射トリガーが(過去の作品)時刻を返します - 注意:この1は未実装のためにしているようで、今
  • +0

    私はCronTriggerを使用して、特定の「期日」が発生したかどうかを知りたいと考えています。私が持っている2つの情報は、「最終期限日時」とcronスケジュールです。だから私がやりたいことは、私が現在の期日を過ぎているかどうかを教えてくれるgetFireTimeAfter(lastDueDate)です。 getTimeBefore()は私が探しているものかもしれません - あまりにも悪いのはまだ実装されていません。 – cambo

    1

    CronTrigger.getFireTimeAfter()メソッドは、指定されたアフタータイムが過去になるのを防ぐための保護メカニズムを備えています。

    これは、あなたが評価している過去の時間と共にsetStartTime firthと呼ぶことによって回避することができます。その後、getFireTimeAfterの呼び出しは有効な結果を返します。

    0

    これは異常ですが、保護メカニズムが存在します。なぜQuartz Teamがそのチェックを持っているのか分かりません。以下のテストでは、私は春にnxtDaynxtDay = nxtTrigger.Value.DateTime.AddHours(1);

    var timeZoneInfo = TimeZoneInfo.FindSystemTimeZoneById("GMT Standard Time"); 
    
    //FREQUENCY OF SECONDS 
    var reccurrence = new Reccurrence 
    { 
        StartTime = new TimeSpan(9, 0, 0), 
        StopTime = new TimeSpan(11, 0, 0), 
        WeekDay = "MON-SUN", 
        TimeZoneInfo = timeZoneInfo, 
        Frequency = 15, 
        FrequencyUnit = FrequencyUnit.Seconds 
    }; 
    
    var autoPublishDetail = new AutoPublishJobDetail("TestReccurence_Seconds", _log, null, reccurrence); 
    var trigger = autoPublishDetail.GetDailyTrigger(); 
    var nxt = trigger.GetNextFireTimeUtc(); 
    
    var jobSeconds = JobBuilder.Create().WithIdentity(new JobKey("TestReccurence_Seconds")).OfType(typeof(AutoPublishJob)).Build(); 
    
    _scheduler.ScheduleJob(jobSeconds, trigger); 
    
    //This job sud run 4 times in a 60 secs and from 9 am to 11 am (Span of 3 hrs including 11 onwards to 11:59:59) 
    //Total runs = 4 x 60 x 3 = 720 
    var today = DateTime.Now; 
    var tomorrow = today.AddDays(1); 
    DateTime? nxtDay = new DateTime(tomorrow.Year, tomorrow.Month, tomorrow.Day); 
    
    int jobCnt = 0; 
    do 
    { 
        var nxtTrigger = trigger.GetFireTimeAfter(nxtDay.Value); 
    
        if (nxtTrigger.Value.Year.Equals(today.AddDays(2).Year) && nxtTrigger.Value.Month.Equals(today.AddDays(2).Month) && nxtTrigger.Value.Day.Equals(today.AddDays(2).Day)) 
         break; 
    
        jobCnt++; 
        nxtDay = nxtTrigger.Value.DateTime.AddHours(1); 
    
    } while (true); 
    
    Assert.AreEqual(720, jobCnt); 
    
    3

    に時間を追加する場合にのみ、あなたは彼らが彼らの統合テストに使用するのと同じアプローチに従うことができ渡します。 CronTriggerTests

    CronTrigger trigger = new CronTrigger(); 
    trigger.setCronExpression("0 0 23 3,18 * ? *"); 
    SimpleTriggerContext triggerContext = new SimpleTriggerContext(); 
    triggerContext.update(null, null, new Date()); 
    Date nextFireAt = trigger.nextExecutionTime(triggerContext); 
    
    関連する問題