2011-12-19 2 views
5

私は石英スケジューラのシンプルなcron式を書こうとしています。私は30日に午前3時に仕事を毎月したい。クォーツcron - 月の日付が存在しない場合はどうなりますか?

0 0 3 30 JAN-DEC ? * 

2月は何が起こるのだろうか?ジョブは実行されるか実行されませんか?

私は月末のソリューションを探しているわけではありません。ジョブを実行する日(すべての月に一度)を選択する必要があります。

答えて

4

L( "last") - 許可される2つのフィールドのそれぞれで異なる意味を持ちます。たとえば、月のフィールドの値「L」は、「月の最終日」を意味します.1月31日、閏年でない月の2月28日です。曜日のフィールドに単独で使用されている場合は、単に「7」または「SAT」を意味します。しかし、別の値の後の曜日のフィールドで使用される場合は、「月の最後のxxx日」を意味します。たとえば、「6L」は「月の最後の金曜日」を意味します。 'L'オプションを使用する場合は、リストや値の範囲を指定しないことが重要です。混乱した結果が得られます。

コーンジョブで直接30を指定する代わりに、これを使用して指定することができます。

http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger

特殊文字をチェック。

ありがとうございました。

+1

を見つけることができます。私はそれが30日に必要なだけです(その日が存在する場合)。 – dcernahoschi

1

実行されません。 2月の場合は28日に実行したい場合は、毎月の曜日ごとに複数のCronExpressionsを作成し、それぞれのトリガーを作成し、必要なJobにすべてのトリガーを追加する必要があります。

これは私がやっていることです:

CronExpressions作成:

public static List<CronExpression> getCronExpressionList(int seconds, int minutes, 
      int hours, int dayInMonth, Month month, 
      DayOfWeek dayOfWeek) { 
    final String monthsWith30Days = Month.APR + "," + Month.JUN + "," 
        + Month.SEP + "," + Month.NOV; 
    List<CronExpression> crons = new LinkedList<CronExpression>(); 

    String timeString = String.format(("%s %s %s "), seconds, minutes, 
        hours, 0, 0, 0); 
    String dateString = "%s %s %s"; 
    String cron = null; 

    cron = timeString + String.format(dateString, dayInMonth, "*", "?"); 
    crons.add(new CronExpression(cron)); 
    if (dayInMonth > 28) { 
     String febCron = timeString + getFebruarLastDayDateString(dateString); 
     crons.add(new CronExpression(febCron)); 
     if (dayInMonth == 31) { 
      String monthsWithThirtyDaysCron = timeString + String.format(dateString, 
        "L", monthsWith30Days, "?"); 
      crons.add(new CronExpression(monthsWithThirtyDaysCron)); 
     } 
    } 
    return crons; 
} 

private static String getFebruarLastDayDateString(String initialCron) 
       throws ParseException { 
    return String.format(initialCron, "L", Month.FEB, "?"); 
} 

トリガーの作成:

 Set<CronTrigger> triggers = new HashSet<>(); 

     int i = 1; 
     for (CronExpression cronEx : cronsList) { 
      CronTrigger trigger = newTrigger() 
        .withIdentity("trigger" + i, groupName) 
        .withSchedule(cronSchedule(cronEx)) 
        .build(); 
       triggers.add(trigger); 
       i++; 
     } 
0

チェック単純なコードこのコードの場合

public class TestCronTrigger { 

    private static final SimpleDateFormat DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd"); 

    public static void main(String[] args) throws Exception { 

     String dateStr = "2015-02-10"; 
     String cron = "0 0 0 31 * ?"; 
     Date nextFireTime = getNextFireTimeFromDateForCron(DATE_FORMAT.parse(dateStr), cron); 
     System.out.println(String.format("For cron '%s' next fire time after '%s' will be '%s'", cron, dateStr, DATE_FORMAT.format(nextFireTime))); 

     dateStr = "2015-02-10"; 
     cron = "0 0 0 30 * ?"; 
     nextFireTime = getNextFireTimeFromDateForCron(DATE_FORMAT.parse(dateStr), cron); 
     System.out.println(String.format("For cron '%s' next fire time after '%s' will be '%s'", cron, dateStr, DATE_FORMAT.format(nextFireTime))); 

     dateStr = "2015-02-10"; 
     cron = "0 0 0 28 * ?"; 
     nextFireTime = getNextFireTimeFromDateForCron(DATE_FORMAT.parse(dateStr), cron); 
     System.out.println(String.format("For cron '%s' next fire time after '%s' will be '%s'", cron, dateStr, DATE_FORMAT.format(nextFireTime))); 

     dateStr = "2015-03-10"; 
     cron = "0 0 0 31 * ?"; 
     nextFireTime = getNextFireTimeFromDateForCron(DATE_FORMAT.parse(dateStr), cron); 
     System.out.println(String.format("For cron '%s' next fire time after '%s' will be '%s'", cron, dateStr, DATE_FORMAT.format(nextFireTime))); 

    } 

    static Date getNextFireTimeFromDateForCron(Date from, String cron) throws ParseException { 
     CronTriggerImpl cronTrigger = new CronTriggerImpl(); 
     cronTrigger.setCronExpression(cron); 
     cronTrigger.setStartTime(from); 
     return cronTrigger.computeFirstFireTime(null); 
    } 
} 

OUTPをUTは次のようになります。

引数で遊ん
For cron '0 0 0 31 * ?' next fire time after '2015-02-10' will be '2015-03-31' 
For cron '0 0 0 30 * ?' next fire time after '2015-02-10' will be '2015-03-30' 
For cron '0 0 0 28 * ?' next fire time after '2015-02-10' will be '2015-02-28' 
For cron '0 0 0 31 * ?' next fire time after '2015-03-10' will be '2015-03-31' 

あなたがさて、私は月の最後、または第二の最後の日にジョブを実行するには興味がないの答え

+0

これは単なる間接的な答えです。私はあなたがOPによって与えられた値のために得られる出力を加えることができれば素晴らしいと思います。これはあなたの答えをより完全にするでしょう。 – honk

関連する問題