石英crontrigger没有在指定的startat()时间发射



我有一个场景,我需要安排一个必须在特定时间执行的作业。当我以特定时间为特定时间作为调度程序的开始时间时,石英不会在设定的开始时间触发作业,而是在下一个周期触发,即24小时延迟后。一天的延迟。

例如:我需要每天安排一份工作才能在晚上6点跑步。并从今天(2018年3月27日(开始。工作没有开始,下一个时间是2018年3月28日下午6点。


代码段:


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);

Spring的调度程序配置


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

解决方案

一个衬里:

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格式打印,我的意思是,输出将将秒零件设置为a默认值为00,所以问题是通过参数是通过秒和毫秒组成的UI的时间戳,因此在cron格式上阅读后,我知道它支持到分钟的分辨率,因此无论它使用何处以获取时间戳startAt(startDateTime)

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

它将通过跳过秒和毫秒部分来计算下一个运行。

最新更新