簡體   English   中英

Quartz CronTrigger沒有在指定的startAt()時間觸發

[英]Quartz CronTrigger is not firing at the specified startAt() time

我有一種情況,我需要安排一個必須在特定時間每天執行的作業。 當我以特定的時間作為調度程序的開始時間進行調度時,石英將不會在設置的開始時間觸發作業,而是會在下一個周期即延遲24小時后觸發。即使檢查nextFireTime,我們也會得到一個一天的延遲。

對於例如:我需要安排一份工作,每天晚上6點運行。 並於今天(2018年3月27日)下午5點開始工作。該工作沒有開始,nextFireTime是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格式,這意味着輸出將設置秒部件默認為00,所以問題是啟動時間是作為參數傳遞的,是通過UI的時間戳,該時間戳是由秒和毫秒組成的,因此在閱讀Cron格式后,我知道它支持直到分鍾的分辨率,無論它用於哪里獲得時間戳記中的startAt(startDateTime)

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

它將跳過秒和毫秒部分來計算下一次運行。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM