* 因为可能会碰到很多异常情况,比如本该删除的job没有删除,本该更新的job没有更新等等
* 这里做统一的处理,处理完成之后,保证与数据库的设置是一致的
*/
private void autofix(){
cache.refresh();
JobDescriptor jd=cache.getJobDescriptor();
if(jd==null){//如果这是一个删除操作,这里将会是null 忽略
//job被删除,需要清理
context.getDispatcher().removeController(this);
destory();
ScheduleInfoLog.info("schedule remove job with jobId:"+jobId);
return;
}
JobDetail detail=null;
try {
detail = context.getScheduler().getJobDetail(jobId, "group");
} catch (SchedulerException e) {
log.error(e);
}
//判断自动调度的开关
if(!jd.getAuto()){
if(detail!=null){
try {
context.getScheduler().deleteJob(jobId, "group");
log.error("schedule remove job with jobId:"+jobId);
} catch (SchedulerException e) {
log.error(e);
}
}
return;
}
if(jd.getScheduleType()==JobScheduleType.Dependent){//如果是依赖任务
if(detail!=null){//说明原来是独立任务,现在变成依赖任务,需要删除原来的定时调度
try {
context.getScheduler().deleteJob(jobId, "group");
ScheduleInfoLog.info("JobId:"+jobId+" from independent to dependent ,remove from schedule");
} catch (SchedulerException e) {
log.error(e);
}
}
}else if(jd.getScheduleType()==JobScheduleType.Independent){//如果是独立任务
ScheduleInfoLog.info("JobId:"+jobId+" independent job,update");
try {
if(detail!=null){
context.getScheduler().deleteJob(jobId, "group");
ScheduleInfoLog.info("JobId:"+jobId+" remove from schedule");
}
CronTrigger trigger=new CronTrigger(jd.getId(), "group", jd.getCronExpression());
detail=new JobDetail(jd.getId(), "group", TimerJob.class);
detail.getJobDataMap().put("jobId",jd.getId());
detail.getJobDataMap().put("dispatcher", context.getDispatcher());
context.getScheduler().scheduleJob(detail, trigger);
ScheduleInfoLog.info("JobId:"+jobId+" add job to schedule for refresh");
} catch (SchedulerException e) {
log.error(e);