Quartz CronTrigger выполняет задания в неправильную дату / время

Я использую следующее выражение cron для выполнения задания каждую пятницу в указанное время дня (в примере ниже 13: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

person Waqas    schedule 04.04.2012    source источник
comment
Вы имели в виду: 0 13 13 ? * FRI?   -  person Tomasz Nurkiewicz    schedule 04.04.2012
comment
о да, на самом деле я скопировал это не из того файла   -  person Waqas    schedule 04.04.2012


Ответы (1)


Ваша проблема заключается в настройке 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 мое сообщение печати не запускается. С его помощью запускается сообщение для печати.

person alexwen    schedule 04.04.2012
comment
Вы также можете проверить время следующего запуска, CronTrigger.getNextFireTime(), чтобы проверить свое выражение cron. - person nobeh; 04.04.2012