springboot整合quartz異常

背景:啓動服務器時,啓動定時任務,同時數據庫記錄了定時任務的信息,一切都是那麼正常。但是我關閉了IDE,重啓系統時異常發生了,報錯如下:

org.quartz.ObjectAlreadyExistsException: Unable to store Job : 'event_job_group.task_SaveFlightDataTask1', because one already exists with this identification。

經過分析得到的結論是由於數據庫已經存在了task 的定義了,就是說重複了,只要將注入到容器當中的Scheduler 在初始化的時候clear()一下就好了:

scheduler.clear();

 這波操作沒問題,但是我就是那麼詭異,經此操作後我在系統中調用接口添加的定時任務也一起沒了!!!一起被清除掉了!!! 怎麼解決呢?

好吧,上面的clear肯定不能再用了。

換種思路來解決:

啓動系統時,先把已經存在的任務刪除了再創建。注意:根據jobKey來刪除。

/**
 * 監聽器,啓動定時任務
 *
 * @author yangfeng
 * @date 2019-03-12
 */
@Configuration
public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent> {
    private static Logger LOG = LoggerFactory.getLogger(ApplicationStartQuartzJobListener.class);

    @Autowired
    private QuartzService quartzService;


    /**
     * 初始啓動quartz
     */
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        try {
             
             LOG.info("************************定時任務啓動開始******************");
             quartzService.createScheduleJob("SaveDataTask",
                            "0 */10 * * * ?", SaveDataTask.class, null);
          }
    }
}
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

/**
 * 定時任務服務
 *
 * @author yangfeng
 * @date 2018-07-03
 */
@Service
public class QuartzService {

    private static final String JOB_GROUP = "event_job_group";
    private static final String TRIGGER_GROUP = "event_trigger_group";

    @Autowired
    private Scheduler scheduler;

    /**
     * 創建定時任務,通過注入Scheduler對任務進行操作
     *
     * @param jobDetailName
     * @param cronExpression
     * @param jobClass
     * @throws SchedulerException
     */
    public void createScheduleJob(String jobDetailName, String cronExpression, Class<? extends Job> jobClass, String param) throws SchedulerException {
        //先把已經有的刪除了
        deleteScheduleJob(jobDetailName, JOB_GROUP);
        JobDetail jobDetail = JobBuilder.newJob(jobClass)
                .withIdentity("task_" + jobDetailName, JOB_GROUP).storeDurably().requestRecovery().build();
        //參數傳遞
        if (!StringUtils.isEmpty(param)) {
            jobDetail.getJobDataMap().put("task_" + jobDetail.getKey(), param);
        }
        CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
        Trigger trigger = TriggerBuilder.newTrigger().withIdentity("task_" + jobDetailName, TRIGGER_GROUP).withSchedule(scheduleBuilder).build();
        scheduler.scheduleJob(jobDetail, trigger);
    }

    /**
     * 刪除定時任務
     *
     * @param jobDetailName
     * @param jobGroup
     * @return
     * @throws SchedulerException
     */
    public boolean deleteScheduleJob(String jobDetailName, String jobGroup) throws SchedulerException {
        JobKey jobKey = JobKey.jobKey("task_" + jobDetailName, jobGroup);
        return scheduler.deleteJob(jobKey);
    }
}

 

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