2011-12-19 10 views
5

Próbuję napisać proste wyrażenie cron dla harmonogramu kwarcu. Chcę, aby praca była wykonywana co miesiąc w dniu 30 o 3 nad ranem.Kwarcowy cron - co jeśli dzień miesiąca nie istnieje?

0 0 3 30 JAN-DEC ? * 

Zastanawiam się, co stanie się w miesiącu lutym? Czy praca będzie wykonywana, czy nie będzie działać?

Nie szukam rozwiązania z ostatniego dnia miesiąca, potrzebuję, aby użytkownik wybrał dzień miesiąca, w którym praca będzie wykonywana (najlepiej raz na wszystkie miesiące).

Odpowiedz

4

L ("last") - ma różne znaczenie w każdym z dwóch pól, w których jest dozwolone. Na przykład, wartość "L" w polu dzień miesiąca oznacza "ostatni dzień miesiąca" - dzień 31 za styczeń, dzień 28 za luty w lata wolne od skoku. Jeśli jest używany w polu dnia tygodnia, oznacza po prostu "7" lub "SAT". Ale jeśli jest używana w polu dnia po innej wartości, oznacza to "ostatni dzień xxx miesiąca" - na przykład "6L" oznacza "ostatni piątek miesiąca". Gdy używasz opcji "L", ważne jest, aby nie określać list ani zakresów wartości, ponieważ uzyskasz mylące wyniki.

Możesz użyć tego do określenia zamiast bezpośredniego podawania 30 w swojej pracy.

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

Sprawdź znaków specjalnych.

Dzięki.

+1

Cóż, nie jestem zainteresowany, aby uruchomić zadanie na ostatnim lub przedostatnim dniu miesiąca. Po prostu potrzebuję go na 30 (jeśli ten dzień istnieje). – dcernahoschi

1

To nie działa. Jeśli chcesz, aby działał w 28. przypadku na luty, musisz utworzyć wiele CronExpressions dla każdego przypadku w miesiącu i wyzwalacz dla każdego, a następnie dodać wszystkie wyzwalacze do wymaganego zadania.

To co mam zrobić: tworzenie

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, "?"); 
} 

tworzenie wyzwalania:

 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

check prosty kod

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

W tym kodzie outp ut będą:

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' 

gry z argumentów można znaleźć odpowiedzi

+0

To tylko pośrednia odpowiedź. Byłbym świetny, gdybyś mógł dodać, jakie wyniki uzyskasz dla wartości podanych przez PO. To sprawi, że odpowiedź będzie bardziej kompletna. – honk

Powiązane problemy