corn表达式如下
@Scheduled(cron = "0 0 23 L * ?") 每月最后一天23:00执行定时任务,但是运行报错
 java.lang.IllegalStateException: Encountered invalid @Scheduled method 'LastReportOfMonth': For input string: "L" 
请问是怎么回事?配置的问题吗,请教!!

解决方案 »

  1.   

    spring的@Scheduled注解的cron不支持L,W,C这些字符
    附上解析部分源码:private void parse(String expression) throws IllegalArgumentException {
    String[] fields = StringUtils.tokenizeToStringArray(expression, " ");
    if (fields.length != 6) {
    throw new IllegalArgumentException(String.format(
    "Cron expression must consist of 6 fields (found %d in \"%s\")", fields.length, expression));
    }
    setNumberHits(this.seconds, fields[0], 0, 60);
    setNumberHits(this.minutes, fields[1], 0, 60);
    setNumberHits(this.hours, fields[2], 0, 24);
    setDaysOfMonth(this.daysOfMonth, fields[3]);
    setMonths(this.months, fields[4]);
    setDays(this.daysOfWeek, replaceOrdinals(fields[5], "SUN,MON,TUE,WED,THU,FRI,SAT"), 8);
    if (this.daysOfWeek.get(7)) {
    // Sunday can be represented as 0 or 7
    this.daysOfWeek.set(0);
    this.daysOfWeek.clear(7);
    }
    }
    private void setDaysOfMonth(BitSet bits, String field) {
    int max = 31;
    // Days of month start with 1 (in Cron and Calendar) so add one
    setDays(bits, field, max + 1);
    // ... and remove it from the front
    bits.clear(0);
    } private void setDays(BitSet bits, String field, int max) {
    if (field.contains("?")) {
    field = "*";
    }
    setNumberHits(bits, field, 0, max);
    }
    private void setNumberHits(BitSet bits, String value, int min, int max) {
    String[] fields = StringUtils.delimitedListToStringArray(value, ",");
    for (String field : fields) {
    if (!field.contains("/")) {
    // Not an incrementer so it must be a range (possibly empty)
    int[] range = getRange(field, min, max);
    bits.set(range[0], range[1] + 1);
    }
    else {
    String[] split = StringUtils.delimitedListToStringArray(field, "/");
    if (split.length > 2) {
    throw new IllegalArgumentException("Incrementer has more than two fields: '" +
    field + "' in expression \"" + this.expression + "\"");
    }
    int[] range = getRange(split[0], min, max);
    if (!split[0].contains("-")) {
    range[1] = max - 1;
    }
    int delta = Integer.valueOf(split[1]);
    if (delta <= 0) {
    throw new IllegalArgumentException("Incrementer delta must be 1 or higher: '" +
    field + "' in expression \"" + this.expression + "\"");
    }
    for (int i = range[0]; i <= range[1]; i += delta) {
    bits.set(i);
    }
    }
    }
    }private int[] getRange(String field, int min, int max) {
    int[] result = new int[2];
    if (field.contains("*")) {
    result[0] = min;
    result[1] = max - 1;
    return result;
    }
    if (!field.contains("-")) {
    result[0] = result[1] = Integer.valueOf(field);
    }
    else {
    String[] split = StringUtils.delimitedListToStringArray(field, "-");
    if (split.length > 2) {
    throw new IllegalArgumentException("Range has more than two fields: '" +
    field + "' in expression \"" + this.expression + "\"");
    }
    result[0] = Integer.valueOf(split[0]);
    result[1] = Integer.valueOf(split[1]);
    }
    if (result[0] >= max || result[1] >= max) {
    throw new IllegalArgumentException("Range exceeds maximum (" + max + "): '" +
    field + "' in expression \"" + this.expression + "\"");
    }
    if (result[0] < min || result[1] < min) {
    throw new IllegalArgumentException("Range less than minimum (" + min + "): '" +
    field + "' in expression \"" + this.expression + "\"");
    }
    return result;
    }
      

  2.   

    可以换每个月1号凌晨0零点来执行
    cron = "0 0 0 1 * ?“