Quartz CronTrigger не срабатывает в указанное время startAt()

У меня есть сценарий, в котором мне нужно запланировать задание, которое должно выполняться ежедневно в определенное время. Когда я планирую его с определенным временем в качестве времени запуска для планировщика, кварц не будет запускать задание в установленное время запуска, а будет запускаться в следующем цикле, т.е. после 24-часовой задержки. Даже при проверке nextFireTime мы получаем дневная задержка.

Например: мне нужно запланировать задание ежедневно, чтобы оно выполнялось в 18:00 вечера. И запустите его в 17:00 сегодня (27 марта 2018 г.). Задание не запускается, а nextFireTime — 18:00 28 марта 2018 г.


Фрагмент кода:


Date startDateTime = new Date(scheduler.getStartDateTime());
Calendar calendar = GregorianCalendar.getInstance();
calendar.setTime(startDateTime);
int hours = calendar.get(Calendar.HOUR_OF_DAY);
int minutes = calendar.get(Calendar.MINUTE);
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(scheduleTriggerName, schdeuleGroupName).startAt(startDateTime).withSchedule(dailyAtHourAndMinute(hours, minutes)).build();
JobDetail jobDetail = this.getJobDetail(schdeuleJobName, schdeuleGroupName);

Конфигурация планировщика на весну


SchedulerFactoryBean schedulerFactoryBean= new SchedulerFactoryBean();

QuartzAutowireBeanFactory jobFactory = new QuartzAutowireBeanFactory();
jobFactory.setApplicationContext(applicationContext);
schedulerFactoryBean.setJobFactory(jobFactory);
schedulerFactoryBean.scheduleJob(jobDetail, trigger)// scheduling the job


person Gautam Naik    schedule 27.03.2018    source источник
comment
может дело в часовом поясе?   -  person yishaiz    schedule 28.03.2018
comment
@yishaiz я тоже так думал, но когда проверил часовой пояс, он был правильным и установлен на местный часовой пояс   -  person Gautam Naik    schedule 28.03.2018


Ответы (1)


Решение

Один лайнер:

Cron обрабатывает только 1-минутные разрешения

Время начала, которое было передано функции startAt(), было отметкой времени до миллисекунд, а cron поддерживает до минут.

поэтому простым решением было использовать календарь, чтобы установить минуты и секунды равными нулю.

calendar.setTime(startDateTime);
            calendar.set(Calendar.SECOND, 0); // this was the solution
            calendar.set(Calendar.MILLISECOND, 0); // this was the solution
            int hours = calendar.get(Calendar.HOUR_OF_DAY);
            int minutes = calendar.get(Calendar.MINUTE);
            trigger = TriggerBuilder.newTrigger();
            trigger.startAt(calendar.getTime()).withSchedule(dailyAtHourAndMinute(hours, minutes));

Подробный: наконец, я понял причину такого поведения, во время отладки я увидел, что он устанавливает задержку в 24 часа, но когда кто-то будет печатать время, оно будет в формате hh:mm:00, я имею в виду, что вывод будет устанавливать части секунд как 00 как по умолчанию, поэтому проблема заключалась в том, что время начала, которое было передано в качестве параметра, представляло собой временную метку через пользовательский интерфейс, состоящую из секунд и миллисекунд, поэтому после прочтения формата Cron я узнал, что он поддерживает разрешение до минут, поэтому везде, где он используется для получения временной метки, startAt(startDateTime) в

CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(scheduleTriggerName, schdeuleGroupName).startAt(startDateTime).withSchedule(dailyAtHourAndMinute(hours, minutes)).build();

он будет вычислять следующий запуск, пропуская секунды и миллисекунды.

person Gautam Naik    schedule 22.04.2018