背景:啓動服務器時,啓動定時任務,同時數據庫記錄了定時任務的信息,一切都是那麼正常。但是我關閉了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);
}
}