java.lang.RuntimeException:CronExpression' 4 27 11? 8? 2014'是无效的,

时间:2014-09-15 06:03:41

标签: java quartz-scheduler cronexpression

将此作为无效的CronExpression,无法找出原因

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

这就是我生成Cron Expression的方式:

public class sample {

    /**
     * @param args
     */
    public static void main(String[] args) {
        Date date = new Date();
        String formatted_date = generateCronExpression(Integer.toString(date.getSeconds()),Integer.toString(date.getMinutes()),
                Integer.toString(date.getHours()), "?", Integer.toString(date.getMonth()), "?", Integer.toString(date.getYear()+1900));

    }
    private static String generateCronExpression(final  String seconds,final String minutes, final String hours, final String dayOfMonth, final String month, final String dayOfWeek, final String year) {
        return String.format("%1$s %2$s %3$s %4$s %5$s %6$s %7$s", seconds,minutes, hours, dayOfMonth, month, dayOfWeek, year);
    }
}

1 个答案:

答案 0 :(得分:3)

''在cron表达式中意味着允许日期和星期几不相互干扰(例如,因此您可以指定在任何星期五触发的cron,无论该月的哪一天或13日每个月,不管是哪一天)。如果你指定它们都是'?'你没有任何日期规范,这是非法的。

当前日期的cron表达式将使用该月中的某天,并忽略星期几。例如,对于今天,2014年9月15日,您指定4 27 11 15 9 ? 2014

这可以通过从java Date对象中提取当前日期来生成:

public static void main(String[] args) {
    Date date = new Date();
    String formatted_date = generateCronExpression
                             (Integer.toString(date.getSeconds()),
                              Integer.toString(date.getMinutes()),
                              Integer.toString(date.getHours()),
                              Integer.toString(date.getDate()),
                              Integer.toString(date.getMonth() + 1), // see Note #2
                              "?",
                              Integer.toString(date.getYear() + 1900));
}

说明:

  1. Date.getDate()Date.getHours()等已弃用 - 您应该使用Calendar.get代替。我保留了OP中的当前代码,以便使解决方案清晰,而不是添加额外细节的混乱。
  2. Date.getMonth()(以及新建议的方法Calendar.get(Calendar.MONTH))返回月份的从零开始的表示(例如,1月为0,2月为1等),而cron表达式为1基于(例如,1月是1,2月是2等) - 所以你应该为cron表达式添加1。