模块一:JobInstance
页面控制台操作:
1、launch:手动触发
应用场景:针对于某些任务定时表达式指定时间尚未到达之前,就可能需要进行执行。
功能说明:立即触发任务执行一次。
后台处理:
if(this.scheduler.checkExists(jobKey)){
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(instance.getId()+"-"+instance.getIdentifier() + "Trigger", Scheduler.DEFAULT_GROUP)
.forJob(jobKey)
.startNow()
.build();
this.scheduler.scheduleJob(trigger);
}else{
JobDataMap newJobDataMap = new JobDataMap();
newJobDataMap.put(MetaData.JOB_INSTANCE_KEY, instance);
JobDetail jobDetail = JobBuilder.newJob(BaseRemoteJob.class)
.withIdentity(jobKey)
.storeDurably(true)
.setJobData(newJobDataMap)
.build();
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(instance.getIdentifier() + "Trigger", Scheduler.DEFAULT_GROUP)
.forJob(jobDetail)
.startNow()
.build();
this.scheduler.scheduleJob(jobDetail,trigger);
}
log.info("launch job {} ", jobKey);
2、set:任务属性修改
应用场景:任务的服务端表达式和别名需要修改
功能说明:a、修改任务的服务端表达式,不为* * * * * * *的情况下按照服务端表达式执行的值重新注册到quartz中。配置为* * * * * * *,则将任务从quartz中清除。
b、修改任务的别名,取代任务在服务端的唯一标识serverKey,在报警和日志信息展示更加易懂和灵活控制。
后台处理:
if(!StringUtils.isEmpty(jobInstance.getServerCronExpress())){
if(!"* * * * * *".equals(jobInstance.getServerCronExpress().trim())){
this.schedulerManager.registeJob(jobInstance);
}else{
this.schedulerManager.cleanUpJob(jobInstance.getIdentifier());
}
}
public void registeJob(JobInstance instance) {
if(instance == null){
throw new NullPointerException("Job instance can not be null");
}
JobKey instanceKey = new JobKey(instance.getIdentifier(), Scheduler.DEFAULT_GROUP);
if(this.batchTempldateJobKeys.contains(instanceKey)){
log.warn("Job key for {} already in batch template, unregistry", instanceKey);
return;
}
if(instance.getServerKeys() != null){//组任务
for(String serverKey : instance.getServerKeys().split(",")){
JobKey jobkey = new JobKey(serverKey, Scheduler.DEFAULT_GROUP);
try {
if(!this.scheduler.deleteJob(jobkey)){
log.warn("Delete job {} failure, maybe it's not scheduled", jobkey);
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
try {
if(!this.scheduler.deleteJob(instanceKey)){//If exists
log.warn("Delete group job {} failure, maybe it's not scheduled", instanceKey);
}
} catch (SchedulerException e1) {
e1.printStackTrace();
}
}else{//普通任务
try {
if(! this.scheduler.deleteJob(instanceKey)){
log.info("Unregistry job {}", instanceKey);
}
} catch (SchedulerException e1) {
e1.printStackTrace();
}
}
JobDataMap newJobDataMap = new JobDataMap();
newJobDataMap.put(MetaData.JOB_INSTANCE_KEY, instance);
JobDetail jobDetail = JobBuilder.newJob(BaseRemoteJob.class)
.withIdentity(instanceKey)
.storeDurably(true)
.setJobData(newJobDataMap)
.build();
String triggerExpress = null;
if(!StringUtils.isEmpty(instance.getServerCronExpress())){
triggerExpress = instance.getServerCronExpress();
}else{
triggerExpress = instance.getCronExpress();
}
Trigger trigger = TriggerBuilder.newTrigger()
.withIdentity(instance.getIdentifier() + "Trigger", Scheduler.DEFAULT_GROUP)
.forJob(jobDetail)
.withSchedule(CronScheduleBuilder.cronSchedule(triggerExpress))
.build();
try {
this.scheduler.scheduleJob(jobDetail, trigger);
log.info("Scheduled job {} with cron {}", instanceKey, triggerExpress);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
public String cleanUpJob(String serverKey){
JobKey jobkey = new JobKey(serverKey, Scheduler.DEFAULT_GROUP);
JobInstance jobGroup = this.jodInstanceDao.findByIdentifier(serverKey);
if(jobGroup!= null && jobGroup.getServerKeys() != null){//组任务
for(String s : jobGroup.getServerKeys().split(",")){
JobKey jKey = new JobKey(s, Scheduler.DEFAULT_GROUP);
try {
if(!this.scheduler.deleteJob(jKey)){
log.warn("Delete job {} failure, maybe it's not scheduled", jKey);
}
} catch (SchedulerException e) {
e.printStackTrace();
return "error";
}
}
try {
if(!this.scheduler.deleteJob(jobkey)){
log.warn("Delete job {} failure, maybe it's not scheduled", jobkey);
}
} catch (SchedulerException e) {
e.printStackTrace();
return "error";
}
}else{//普通任务
try {
if(!this.scheduler.deleteJob(jobkey)){
log.warn("Delete job {} failure, maybe it's not scheduled", jobkey);
}
} catch (SchedulerException e) {
e.printStackTrace();
return "error";
}
}
return "success";
}
3、rule:任务规则设置
应用场景:设置任务的规则,从而让异常检测模块来根据配置的规则检测任务的超时情况以及检测问题后是否发送短信和发送短信的号码、短信级别。
功能说明:设置超时的倍数(比最近一次正常执行时间的多少倍为超时判断的标准)、设置是否发送短信、发送短信的号码、发送短信的级别。