pom.xml配置文件信息
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.5.2</version>
</dependency>
创建数据库
CREATE TABLE `cc_task_info` (
`TID` int(11) NOT NULL AUTO_INCREMENT,
`TASK_ANME` varchar(50) NOT NULL,
`TASK_CODE` varchar(50) NOT NULL,
`JOB_CLASS` varchar(200) NOT NULL,
`JOB_GROUP` varchar(50) NOT NULL,
`CRON` varchar(50) NOT NULL,
`DEL_STATUS` varchar(2) DEFAULT '1' NULL,
`CRT_TIME` datetime DEFAULT NULL,
PRIMARY KEY (`TID`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='定时任务管理表';
对cc_task_info的增删改查
CcTaskInfo
package com.shengun.quartz.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableField;
import java.io.Serializable;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
/**
* <p>
* 定时任务管理表
* </p>
*
* @author shengun
* @since 2022-06-08
*/
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@ApiModel(value="CcTaskInfo对象", description="定时任务管理表")
public class CcTaskInfo implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "TID", type = IdType.AUTO)
private Integer tid;
@TableField("TASK_ANME")
private String taskAnme;
@TableField("TASK_CODE")
private String taskCode;
@TableField("JOB_CLASS")
private String jobClass;
@TableField("JOB_GROUP")
private String jobGroup;
@TableField("CRON")
private String cron;
@TableField("DEL_STATUS")
private String delStatus;
@TableField("CRT_TIME")
private Date crtTime;
}
CcTaskInfoService
package com.shengun.quartz.service;
import com.shengun.quartz.entity.CcTaskInfo;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 定时任务管理表 服务类
* </p>
*
* @author shengun
* @since 2022-06-08
*/
public interface CcTaskInfoService extends IService<CcTaskInfo> {
//增
public void addTaskInfo(CcTaskInfo ccTaskInfo);
//删除
public void delTaskInfo(int id);
//改
public void updateTaskInfo(CcTaskInfo ccTaskInfo);
//查
public List<CcTaskInfo> getTaskInfo();
}
CcTaskInfoServiceImpl
package com.shengun.quartz.service.impl;
import com.shengun.quartz.entity.CcTaskInfo;
import com.shengun.quartz.mapper.CcTaskInfoMapper;
import com.shengun.quartz.service.CcTaskInfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.shengun.quartz.service.QuartzService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.transaction.Transactional;
import java.util.List;
/**
* <p>
* 定时任务管理表 服务实现类
* </p>
*
* @author shengun
* @since 2022-06-08
*/
@Service
public class CcTaskInfoServiceImpl extends ServiceImpl<CcTaskInfoMapper, CcTaskInfo> implements CcTaskInfoService {
@Autowired
private QuartzService quartzService;
@Transactional
@Override
public void addTaskInfo(CcTaskInfo ccTaskInfo) {
//现在数据库中添加详细信息
int insert = this.baseMapper.insert(ccTaskInfo);
if(insert>0){
//在启动定时任务
try {
quartzService.startJob(ccTaskInfo.getTaskCode(),
ccTaskInfo.getTaskAnme(),
ccTaskInfo.getCron(),
ccTaskInfo.getJobGroup(),
ccTaskInfo.getJobClass());
} catch (Exception e) {
e.printStackTrace();
}
}
}
@Override
public void delTaskInfo(int id) {
this.baseMapper.deleteById(id);
}
@Override
public void updateTaskInfo(CcTaskInfo ccTaskInfo) {
this.baseMapper.updateById(ccTaskInfo);
}
@Override
public List<CcTaskInfo> getTaskInfo() {
return this.baseMapper.selectList(null);
}
}
CcTaskInfoController
package com.shengun.quartz.controller;
import com.shengun.annotation.OperationAnnotation;
import com.shengun.quartz.entity.CcTaskInfo;
import com.shengun.quartz.service.CcTaskInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* <p>
* 定时任务管理表 前端控制器
* </p>
*
* @author shengun
* @since 2022-06-08
*/
@RestController
@RequestMapping("/quartz/cc-task-info")
public class CcTaskInfoController {
@Autowired
private CcTaskInfoService ccTaskInfoService;
@GetMapping("/list")
@OperationAnnotation
public Map<String,Object> getTaskInfos(){
Map<String, Object> map = new HashMap<>();
map.put("code", 200);
map.put("msg", "查询成功");
List<CcTaskInfo> taskInfos = ccTaskInfoService.getTaskInfo();
map.put("list",taskInfos);
return map;
}
@PostMapping("/add")
@OperationAnnotation
public Map<String,Object> addTaskInfo(@RequestBody CcTaskInfo ccTaskInfo){
Map<String, Object> map = new HashMap<>();
map.put("code", 200);
map.put("msg", "添加成功");
if(ccTaskInfo.getCron() == null){
return null;
}
ccTaskInfo.setCrtTime(new Date());
ccTaskInfoService.addTaskInfo(ccTaskInfo);
map.put("flag", true);
return map;
}
}
定时任务配置文件QuartzConfig
package com.shengun.quartz.config;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class QuartzConfig {
@Bean
public Scheduler scheduler(){
Scheduler scheduler = null;
SchedulerFactory factory = new StdSchedulerFactory();
try {
scheduler = factory.getScheduler();
} catch (SchedulerException e) {
e.printStackTrace();
}
if(scheduler != null){
try {
//启动定时任务
scheduler.start();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
return scheduler;
}
}
QuartzService定时任务服务
package com.shengun.quartz.service;
import com.shengun.quartz.entity.CcTaskInfo;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.PostConstruct;
import java.util.Date;
import java.util.List;
/**
* 定时任务管理服务
*/
@Service
public class QuartzService {
public static String SCHEDULER_OPR_START = "start";
public static String SCHEDULER_OPR_PAUSE = "pause";
public static String SCHEDULER_OPR_RESUME = "resume";
public static String SCHEDULER_OPR_REMOVE = "remove";
@Autowired
private CcTaskInfoService ccTaskInfoService;
@Autowired
private Scheduler scheduler;
/**
* 项目启动的时候初始化
*/
@PostConstruct
public void init(){
List<CcTaskInfo> taskInfo = ccTaskInfoService.getTaskInfo();
for (CcTaskInfo ccTaskInfo : taskInfo) {
if(ccTaskInfo.getDelStatus().equals("1")){
System.out.println("#######可以启动:" + ccTaskInfo.getTaskAnme());
try {
startJob(ccTaskInfo.getTaskCode(),
ccTaskInfo.getTaskAnme(),
ccTaskInfo.getCron(),
ccTaskInfo.getJobGroup(),
ccTaskInfo.getJobClass());
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
/**
* 启动任务
*/
public void startJob(String taskCode, String taskAnme, String cron, String jobGroup,
String className) throws Exception{
Class<Job> jobClass = null;
try {
jobClass = (Class<Job>) Class.forName(className);//获取任务执行类
} catch (ClassNotFoundException e) {
throw new Exception("任务类不存在");
}
//创建job,指定job名称和分组
JobDetail jobDetail = JobBuilder.newJob(jobClass).withIdentity(taskCode, jobGroup).build();
//创建表达式工作计划
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);
//创建触发器
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskCode, jobGroup)
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
/**
* 修改定时任务执行时间
* @param taskCode
* @param jobGroup
* @param cron 新的时间
* @throws Exception
*/
public void modifyJob(String taskCode, String jobGroup, String cron) throws Exception{
TriggerKey triggerKey = new TriggerKey(taskCode, jobGroup);
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
String oldCron = trigger.getCronExpression();
if(!oldCron.equals(cron)){
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(taskCode, jobGroup)
.withSchedule(CronScheduleBuilder.cronSchedule(cron)).build();
Date date = scheduler.rescheduleJob(triggerKey, cronTrigger);
if(date == null){
throw new Exception("修改定时任务执行时间报错");
}
}
}
/**
* 暂停某个定时任务(任务恢复后,暂停时间段内未执行的任务会继续执行,如暂停时间段内有2次,则会执行2次)
* @param taskCode
* @param jobGroup
* @throws Exception
*/
public void pauseJob(String taskCode, String jobGroup) throws Exception{
JobKey jobKey = new JobKey(taskCode, jobGroup);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail == null){
return;
}
scheduler.pauseJob(jobKey);
}
/**
* 恢复某个定时任务
* @param taskCode
* @param jobGroup
* @throws Exception
*/
public void resumeJob(String taskCode, String jobGroup) throws Exception{
JobKey jobKey = new JobKey(taskCode, jobGroup);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail == null){
return;
}
scheduler.resumeJob(jobKey);
}
/**
* 删除某个定时任务
* @param taskCode
* @param jobGroup
* @throws Exception
*/
public void deleteJob(String taskCode, String jobGroup) throws Exception{
JobKey jobKey = new JobKey(taskCode, jobGroup);
JobDetail jobDetail = scheduler.getJobDetail(jobKey);
if(jobDetail == null){
return;
}
scheduler.deleteJob(jobKey);
}
}
创建几个定时任务
package com.shengun.quartz.task;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
public class DemoJob1 implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
String taskCode = jobExecutionContext.getJobDetail().getKey().getName();
System.out.println("定时任务1"+taskCode + new Date());
}
}
数据库中的数据
运行结果