定时读取mysql_自定义定时任务(从数据库读定时任务)

该博客介绍了一个实现自定义定时任务的Java类`QuartzManager`,该类通过读取MySQL数据库中的`MsgSendSchemaEntity`来配置Quartz定时任务。当任务状态改变或过期时,类会更新或移除相应的Quartz任务。
摘要由CSDN通过智能技术生成

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;

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值