目前对于定时功能的需求越来越多,这篇文章描述了如何动态实现定时任务,可以将所有定时任务的属性存储到数据库中,后端编写查询所有定时任务列表(包含无参数限制查询和有参数限制模糊查询),前端调用查询接口可以将所有定时任务显示出来,前端也可以选中某个定时任务,调用后端开启定时任务、关闭定时任务、恢复定时任务、删除定时任务以及修改定时任务刷新周期等接口完成对定时任务的动态处理。
1.创建数据库以及创建定时任务表
2.创建对应的实体类
package com.mhc.common.scheduler;
/**
* job基本信息
* Description:
* User: mhc
* Date: 2019-06-25
* Time: 20:46
*/
public class ScheduleJob {
/** 任务id */
private String jobId;
/** 任务名称 */
private String jobName;
/** 任务分组 */
private String jobGroup = "default-group";
/** 任务状态 0禁用 1启用 2删除*/
private String jobStatus = JobStatus.RUNNING;
/** 任务运行时间表达式 */
private String cronExpression;
/** 任务描述 */
private String desc;
/**任务全类名**/
private String beanClass;
public ScheduleJob(){}
public ScheduleJob(String jobId, String jobName, String jobGroup, String jobStatus, String cronExpression, String desc) {
this.jobId = jobId;
this.jobName = jobName;
this.jobGroup = jobGroup;
this.jobStatus = jobStatus;
this.cronExpression = cronExpression;
this.desc = desc;
}
public ScheduleJob(String jobId, String jobName, String cronExpression) {
this.jobId = jobId;
this.jobName = jobName;
this.cronExpression = cronExpression;
}
public ScheduleJob(String jobId, String jobName) {
this.jobId = jobId;
this.jobName = jobName;
}
3.创建定时任务状态接口
package com.mhc.common.scheduler;
/**
* Job状态
*/
public interface JobStatus {
/**禁用*/
String STOPED="0";
/**启用*/
String RUNNING="1";
/**删除*/
String DELETED="2";
}
4.定义配置类
配置类主要定义三个对象:
(1)定时任务jobDetail:只要用来封装你要做什么,执行什么业务操作。
(2)定时任务触发器jobTrigger:主要将定时任务jobDetail封装,同时封装cron表达式,说明什么时间触发定时任务或者多长时间触发刷新一次定时任务。
(3)quartz调度工厂scheduler:主要将jobTrigger触发器封装,调用自己的api执行定时任务
package com.mhc.common.scheduler;
import org.quartz.Trigger;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
import org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean;
import org.springframework.scheduling.quartz.SchedulerFactoryBean;
/**
* Created with IntelliJ IDEA.
* Description:
* User: mhc
* Date: 2019-06-25
* Time: 21:10
*/
@Configuration
public class QuartzConfigration {
/**
* 配置定时任务
* @param task
* @return
*/
@Bean(name = "jobDetail")
public MethodInvokingJobDetailFactoryBean detailFactoryBean(ScheduleDefaultTask task) {
MethodInvokingJobDetailFactoryBean jobDetail = new MethodInvokingJobDetailFactoryBean();
//是否并发执行即是否等待当前未执行完的任务
jobDetail.setConcurrent(false);
jobDetail.setName("default");// 设置任务的名字
jobDetail.setGroup("default-group");// 设置任务的分组,这些属性都可以存储在数据库中,在多任务的时候使用
jobDetail.setTargetObject(task);
jobDetail.setTargetMethod("defaultExecute");
return jobDetail;
}
/**
* 配置定时任务的触发器
* @param jobDetail
* @return
*/
@Bean(name = "jobTrigger")
public CronTriggerFactoryBean cronJobTrigger(MethodInvokingJobDetailFactoryBean jobDetail) {
CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
tigger.setJobDetail(jobDetail.getObject());
tigger.setCronExpression("0 0 0 1/1 * ?");// 初始时的cron表达式
tigger.setName("default-tigger");// trigger的name
return tigger;
}
/**
* quartz调度工厂
* @param cronJobTrigger
* @return
*/
@Bean(name = "scheduler")
public SchedulerFactoryBean schedulerFactory(Trigger cronJobTrigger,MyAdaptableJobFactory myAdaptableJobFactory) {
SchedulerFactoryBean bean = new S