quartz使用過程中的一個尷尬問題

話說我想做一個任務,在每天晚上的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沒有秒位,某個時間觸發就設置小時和分鐘就可以了,沒有意識到秒也需要設置。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章