Quartz CronTrigger在错误的日期/时间执行作业

时间:2012-04-04 08:45:40

标签: java quartz-scheduler cronexpression

我正在使用以下cron表达式在每个星期五的指定时间执行作业(在下面的示例中,下午1:13)。

0 13 13 ? * FRI

所以预期的行为应该是如果我在星期五之外的任何一天初始化此触发器,那么它应该在下周五之前不会开始执行。但是在我的情况下发生的事情是,即使我今天初始化了这个触发器(如今天是星期三),它也会在此刻开始执行工作。

相关的java源码:

CronTrigger cronTrigger = new CronTrigger("trigger_" + groupName, groupName, cronExpression);
cronTrigger.setStartTime(startDate); //startDate = 1-Mar-2012
cronTrigger.setEndTime(endDate);     //endDate   = 30-Apr-2012

1 个答案:

答案 0 :(得分:3)

您的问题是配置startTime。 startTime意味着触发器应该发生的时间。由于日期是旧的,这会导致调度程序失火,默认行为是调度程序立即重新启动。

删除setStartTime,默认行为是将startTime设置为当前时间,第一个触发时间将是本周四开始时间后cron触发器的匹配。

快速小测试我一起来验证:

public class Test {
    public static void main(String[] args) throws ParseException, SchedulerException {
        String groupName = "group";
        String cronExpression = "0 13 13 ? * THUR";

        CronTrigger cronTrigger = new CronTrigger("trigger_" + groupName, groupName, cronExpression);
        cronTrigger.setStartTime(new Date(0));
        Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
        JobDetail detail = new JobDetail("testJob", groupName, TestJob.class);
        scheduler.scheduleJob(detail, cronTrigger);
        scheduler.start();
        try {
            Thread.sleep(50001);
        } catch (Exception ignore) {
        }

    }

    public static class TestJob implements Job {
        public void execute(JobExecutionContext context) throws JobExecutionException {
            System.out.println("TEST");
        }
    }
}

删除setStartTime时,我的打印消息不会触发。有了它,就会触发打印消息。