说明
本次整合quartz使用spring-boot-starter-quartz,实现多线程运行定时任、随时新增、修改、暂停定时任。
pom.xml文件
使用idea创建springboot工程,maven需单独要引入spring-boot-starter-quartz。具体详细文件如下:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.2.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.quartz</groupId>
<artifactId>quartz</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>quartz</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
有两种方法实现定时任务,先说第一种:
1、新建定时任务相关信息实体类ScheduleJob
该类用于存放定时任务详细信息,可与数据库中定时任务表对应。代码省去了get/set
package com.quartz.quartz.domain;
/**
*@Description
*@Author lusen
*@Date 2019/12/26 11:40
*/
public class ScheduleJob
{
/**
* id
*/
private Integer id;
/**
* 任务名称
*/
private String jobName;
/**
* 任务描述
*/
private String jobDesc;
/**
* 服务名称
*/
private String beanName;
/**
* 方法名称
*/
private String methodName;
/**
* 方法参数
*/
private String parameter;
/**
* cron表达式
*/
private String cexp;
/**
* 状态
*/
private int status;
/**
* 定是任务启动个数
*/
private int schedulerNum;
}
2、新建定时任务执行工厂
该类决定了最终如何执行定时任务代码
package com.quartz.quartz.quartz;
import com.quartz.quartz.domain.ScheduleJob;
import com.quartz.quartz.utils.MethodUtil;
import com.quartz.quartz.utils.SpringContextUtil;
import org.quartz.DisallowConcurrentExecution;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
/**
* @author: lusen
* @Date: 2019/12/24 14:46
* @Description: 定时任务执行工厂
* DisallowConcurrentExecution 表示同一个定时任务,需要上次定时任务执行完成后,才会开始下次定时任务执行。
*/
@DisallowConcurrentExecution
public class QuartzFactory implements Job
{
@Override
public void execute(JobExecutionContext jobExecutionContext)
{
//获取调度数据
ScheduleJob scheduleJob =
(ScheduleJob)jobExecutionContext.getMergedJobDataMap()
.get("scheduleJob");
try
{
//获取对应的Bean
Object object =
SpringContextUtil.getBean(scheduleJob.getBeanName());
String[] parameters = null;
if(null == scheduleJob.getParameter() || "".equals(scheduleJob.getParameter()))
{
parameters = new String[]{};
}
else
{
parameters = scheduleJob.getParameter().split(",");
}
// 使用反射的方式执行定时任务
MethodUtil.invokeMethod(object,
object.getClass(),
scheduleJob.getMethodName(),
parameters);
}
catch (Exception e)
{
e.printStackTrace();
}
}
}
3、新建定时任务操作接口QuartzService和对应实现QuartzServiceImpl
QuartzService
package com.quartz.quartz.service;
import com.quartz.quartz.domain.ScheduleJob;
import com.sun.xml.internal.bind.v2.TODO;
import org.springframework.scheduling.quartz.QuartzJobBean;
import java.util.List;
import java.util.Map;
/**
* @author: lusen
* @Date: 2019/12/24 14:50
* @Description: 定时任务操作接口
*/
public interface QuartzService
{
/**
* @author: lusen
* @Date: 2019/12/24 15:12
* @Description: 初始化定时任务
*/
void initTask(List<ScheduleJob> scheduleJobList);
/**
* @author: lusen
* @Date: 2019/12/24 15:12
* @Description: 新增定时任务
*/
void addJob(ScheduleJob job);
/**
* @author: lusen
* @Date: 2019/12/24 15:13
* @Description: 暂停、启动、删除定时任务
* status:pause暂停,start启动,del删除
*/
void operateJob(String status, ScheduleJob job);
/**
* @author: lusen
* @Date: 2019/12/24 15:15
* @Description: 启动所有定时任务
*/
void startAllJob();
/**
* @author: lusen
* @Date: 2019/12/24 15:15
* @Description: 暂停所有定时任
*/
void pauseAllJob();
/**
* @author: lusen
* @Date: 2019/12/24 15:16
* @Description: 更新定时任务
*/
void updateJob(ScheduleJob job);
/**
* @author: lusen
* @Date: 2019/12/25 16:08
* @Description: c查询所有定时任务
*/
List<Map<String, Object>> queryAllJob();
/**
* @author: lusen
* @Date: 2019/12/25 16:09
* @Description: 查询所有运行中的定时任务
*/
List<Map<String, Object>> queryRunJob();
void runAJobNow(String jobName, String jobGroupName);
/**
* @author: lusen
* @Date: 2019/12/26 10:26
* @Description:
* @param jobClass
* 任务实现类
* @param jobName
* 任务名称(建议唯一)
* @param jobGroupName
* 任务组名
* @param jobTime
* 时间表