packagecom.ql.vessels.schemajob;importcom.fqgj.log.factory.LogFactory;importcom.fqgj.log.interfaces.Log;importcom.ql.vessels.common.util.DateUtils;importcom.ql.vessels.domain.services.MsgSendSchemaService;importcom.ql.vessels.repo.entity.MsgSendSchemaEntity;importcom.ql.vessels.repo.entity.PushSchemaEntity;importcom.ql.vessels.repo.vo.TaskVo;importorg.quartz.JobDataMap;importorg.quartz.JobDetail;importorg.quartz.Scheduler;importorg.quartz.SchedulerException;importorg.springframework.beans.BeansException;importorg.springframework.beans.factory.BeanFactory;importorg.springframework.beans.factory.BeanFactoryAware;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.scheduling.quartz.CronTriggerBean;importjava.util.Date;importjava.util.HashMap;importjava.util.List;importjava.util.Map;/***@authorvampire
* @date 2019/5/16 10:08 AM*/
public class QuartzManager implementsBeanFactoryAware {private final static Log log = LogFactory.getLog(QuartzManager.class);privateScheduler scheduler;private staticBeanFactory beanFactory;
@Autowired
MsgSendSchemaService msgSendSchemaService;/*** 定时要执行的方法类。*/
public voidreScheduleJob() {//1.读取数据库中的任务列表。
Date now = newDate();
Map map= new HashMap(4);
map.put("sendType", 2);//获取短信定时任务
List list =msgSendSchemaService.selectByParams(map);for(MsgSendSchemaEntity sendSchema : list
) {
TaskVo taskVo= newTaskVo();
taskVo.setTaskId(sendSchema.getId());
taskVo.setTaskType(1);
taskVo.setCronExpression(DateUtils.getCron(sendSchema.getSendTime()));
taskVo.setState(sendSchema.getStatus());if (sendSchema.getStatus() != 0 ||now.after(sendSchema.getSendTime())) {//去掉过时的任务
removeExpireTasks(taskVo);
}else{
configSchedul(taskVo);
}
}}/*** 移除过期任务
*
*@parambo*/
private voidremoveExpireTasks(TaskVo bo) {try{
CronTriggerBean trigger= (CronTriggerBean) scheduler.getTrigger(bo.getTaskId() + "name" +bo.getTaskType(), Scheduler.DEFAULT_GROUP);if (trigger != null) {
log.info("==移除任务==" + bo.getTaskId() + "name" +bo.getTaskType());
scheduler.pauseTrigger(trigger.getName(), trigger.getGroup());//停止触发器
scheduler.unscheduleJob(trigger.getName(), trigger.getGroup());//移除触发器
scheduler.deleteJob(trigger.getJobName(), trigger.getJobGroup());//删除任务
}
}catch(SchedulerException e) {
log.error("移除任务失败...");
e.printStackTrace();
}
}/*** 配置任务列表
*
*@parambo*/
private voidconfigSchedul(TaskVo bo) {try{
CronTriggerBean trigger= (CronTriggerBean) scheduler.getTrigger(bo.getTaskId() + "name" +bo.getTaskType(), Scheduler.DEFAULT_GROUP);if (trigger == null) {//说明schedule中不存在该定时任务
createTriggerTask(bo);
}else{
updateTriggerTask(bo, trigger);
}
}catch(SchedulerException e) {
log.error("获取触发器trigger失败...");
e.printStackTrace();
}
}/*** 更新任务列表
*
*@parambo*/
private voidupdateTriggerTask(TaskVo bo, CronTriggerBean trigger) {if (bo.getState() == 0) {try{//判断从DB中取得的任务时间和现在的quartz线程中的任务时间是否相等//如果相等,则表示用户并没有重新设定数据库中的任务时间,这种情况不需要重新rescheduleJob
if (trigger.getCronExpression() != null &&
!trigger.getCronExpression().equalsIgnoreCase(bo.getCronExpression())) {
log.info("=真正更新方法:=" + bo.getTaskId() + "name" +bo.getTaskType());
trigger.setCronExpression(bo.getCronExpression());
scheduler.rescheduleJob(bo.getTaskId()+ "name" +bo.getTaskType(), Scheduler.DEFAULT_GROUP, trigger);
log.info("更新任务时间失败...");
}
}catch(Exception e) {
log.error("更新任务时间失败...");
e.printStackTrace();
}
}else{this.removeExpireTasks(bo);
}
}/*** 创建任务列表
*
*@parambo*/
private voidcreateTriggerTask(TaskVo bo) {if (bo.getState() == 0) {
log.info("=创建:=" + bo.getTaskId() + "name" +bo.getTaskType());try{
Class clazz= QuartzJobFactory.class;//执行计划任务的类JobDetail jobDetail= new JobDetail(bo.getTaskId() + "", clazz);
Map map= newHashMap();
map.put("task", bo);
jobDetail.setJobDataMap(newJobDataMap(map));
jobDetail.setName(bo.getTaskId()+ "name" +bo.getTaskType());
scheduler.addJob(jobDetail,true); //将Job添加到管理类//新一个基于Spring的时间类
CronTriggerBean c = newCronTriggerBean();
c.setCronExpression(bo.getCronExpression());//设置时间表达式
c.setName(bo.getTaskId() + "name" + bo.getTaskType());//设置名称
c.setJobDetail(jobDetail);//注入Job
c.setJobName(bo.getTaskId() + "name" + bo.getTaskType());//设置Job名称
scheduler.scheduleJob(c);//注入到管理类
scheduler.rescheduleJob(bo.getTaskId() + "name" + bo.getTaskType(), Scheduler.DEFAULT_GROUP, c);//刷新管理类
} catch(Exception e) {
log.error("创建" + bo.getTaskId() + "name" + bo.getTaskType() + "任务失败...");
e.printStackTrace();
}
}else{this.removeExpireTasks(bo);
}
}
@Overridepublic void setBeanFactory(BeanFactory beanFactory) throwsBeansException {this.beanFactory =beanFactory;
}publicScheduler getScheduler() {returnscheduler;
}publicQuartzManager setScheduler(Scheduler scheduler) {this.scheduler =scheduler;return this;
}public staticBeanFactory getBeanFactory() {returnbeanFactory;
}
}