似乎当月的某天具有工作日标记时,在处理下一次触发时间时,Quartz CronExpression类中存在一个错误。
也就是说, W似乎不像您上面描述的那样工作,因为它找到了最近的工作日而不是下一个工作日。 因此,如果15号落在周六,该工作将在前一个周五进行。
从理论上讲,您可以通过编写自己的Trigger或Calendar实现来解决此问题。 另外,您也可以每天早上8点触发作业,如果这是一个无效的日期,可以提前终止。 例如,在您的工作的第一行,您可能会遇到以下行:
if (!shouldRunToday()) {
return;
};
的实现shouldRunToday使用JodaTime可能看起来是这样的:
public static boolean shouldRunToday() {
LocalDate date = LocalDate.now();
Set days = new HashSet<>();
days.add(1);
days.add(15);
DayOfWeek dayOfWeek = DayOfWeek.of(date.getDayOfWeek());
if (dayOfWeek == DayOfWeek.MONDAY) {
days.add(2);
days.add(3);
days.add(16);
days.add(17);
}
Set weekend = EnumSet.of(DayOfWeek.SATURDAY, DayOfWeek.SUNDAY);
return days.contains(date.getDayOfMonth()) && !weekend.contains(dayOfWeek);
}
如果要使用日历,则等效代码如下所示
public static boolean shouldRunToday() {
Calendar date = Calendar.getInstance();
Set days = new HashSet<>();
days.add(1);
days.add(15);
int dayOfWeek = date.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek == Calendar.MONDAY) {
days.add(2);
days.add(3);
days.add(16);
days.add(17);
}
List weekend = Arrays.asList(Calendar.SATURDAY, Calendar.SUNDAY);
return days.contains(date.get(Calendar.DAY_OF_MONTH)) && !weekend.contains(dayOfWeek);
}