如前所述,您必須爲月份中的每個天數情況創建多個CronExpressions,併爲每個情況創建一個觸發器,然後將所有觸發器添加到所需的Job中。
這是我的版本:
CronExpressions創作:我在二月的cron使用「L」,否則你將不得不在閏年的錯誤
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++;
}
使用L(或任何其他變體L-X)沒有在我的處境有所幫助。用戶可以指定首次運行作業的任何開始日期。這個開始日期的月份必須用來每月運行工作。所以,它可以是1-31。問題在於29-31,因爲不是所有的月份都有。因此,如果用戶選擇Janurary 30日,則工作必須在2月29日,3月30日,4月30日等運行。 3月28日,使用L-3將在2月25日(非閏年)觸發 - 但這不是我所需要的。作業必須在指定的日期或上一個最近的日期運行。 – ilu 2012-07-12 18:52:33