話說我想做一個任務,在每天晚上的1:30分執行,下面這段代碼有毛病嗎?
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(JobDetail jobDetail){
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail);
trigger.setCronExpression("* 30 1 * * ?");
trigger.setName("cal-ushimata");
return trigger;
}
看了好久也沒看出問題,或者說一直沒意識到會是這裏有問題。卻在執行時噼裏啪啦跑了很多次,一直以爲是併發的問題,找了很多相關的資料,包括
1.在job類上加註解@DisallowConcurrentExecution
2.在application.properties里加org.quartz.jobstore.acquireTriggerWithinLock=true
3.JobDetailFactoryBean裏面jobDetail.setConcurrent(false);是早就加過的
都沒能達到預計的結果
偶然間回過頭再去看cron的規則,發現秒位不能用*,不然就表示在1:30分的那一分鐘裏面都會不停的觸發了,事實上也是這樣,1分鐘過後就沒有任務進來了。正確的寫法應該是這樣
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(JobDetail jobDetail){
CronTriggerFactoryBean trigger = new CronTriggerFactoryBean();
trigger.setJobDetail(jobDetail);
trigger.setCronExpression("0 30 1 * * ?");
trigger.setName("cal-ushimata");
return trigger;
}
其實也是跟之前在linux上設置crontab的習慣有點關係,crontab沒有秒位,某個時間觸發就設置小時和分鐘就可以了,沒有意識到秒也需要設置。