动态定时任务步骤如下:
1.添加相关依赖,当然其中mysql和jpa可以结合自己的:
<!-- jpa依赖 start-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- jpa依赖 start-->
<!-- mysql依赖 start-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mysql依赖 end-->
<!-- quartz -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
2.新建数据库实体
package com.wgu.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import javax.persistence.*;
/**
* @Author: w
* @Date: 2019/9/19 8:55
* @Version 1.0
*/
@Data
@Entity
@Table(name = "wgu_job") // 数据库名字
@NoArgsConstructor
public class Job {
@Id
@GeneratedValue(strategy= GenerationType.IDENTITY) //自增长
@Column(columnDefinition="int(11) COMMENT '任务id'")
private Long id;
@Column(columnDefinition = "varchar(50) COMMENT '任务类名'")
private String jobClassName;
// 组名
@Column(columnDefinition = "varchar(50) COMMENT '任务分组名'")
private String jobGroupName;
// cron表达式
@Column(columnDefinition = "varchar(50) COMMENT 'cron时间表达式'")
private String cronExpression;
@Column(columnDefinition = "varchar(2) COMMENT '任务状态 0-暂停 1-启动'")
private String status;//状态 0-暂停 1-启动
}
3.新建仓库层
略。
4.新建baseJob
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public interface BaseJob extends Job {
public void execute(JobExecutionContext context) throws JobExecutionException;
}
5.核心工具类
import com.wgu.job.BaseJob;
import org.quartz.*;
import javax.annotation.Resource;
import java.util.Iterator;
import java.util.Map;
/**
* @Author: w
* @Date: 2019/9/18 8:58
* @Version 1.0
*/
public class MyScheduler {
@Resource
private Scheduler scheduler;
/**
* 添加定时任务并启动
* @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
* @param jobGroupName 任务分组名
* @param cronExpression cron表达式 控制时间
* @throws Exception
*/
public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception{
// 启动调度器
scheduler.start();
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
.withIdentity(jobClassName, jobGroupName).build();
// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
}
/**
* 暂停定时任务
* @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
* @param jobGroupName 任务分组名
* @throws Exception
*/
public void pauseJob(String jobClassName, String jobGroupName) throws Exception{
scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName));
}
/**
* 恢复定时任务
* @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
* @param jobGroupName 任务分组名
* @throws Exception
*/
public void resumeJob(String jobClassName, String jobGroupName) throws Exception{
scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName));
}
/**
* 删除定时任务
* @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
* @param jobGroupName 任务分组名
* @throws Exception
*/
public void deleteJob(String jobClassName, String jobGroupName) throws Exception{
scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName));
scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName));
}
/**
* 修改定时任务并立即启动
* @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
* @param jobGroupName 任务分组名
* @param cronExpression cron表达式
* @throws Exception
*/
public void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception{
TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName);
// 表达式调度构建器(动态修改后不立即执行)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression).withMisfireHandlingInstructionDoNothing();
CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey);
// 按新的cronExpression表达式重新构建trigger
trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build();
// 按新的trigger重新设置job执行
scheduler.rescheduleJob(triggerKey, trigger);
}
/**
* 新增定时任务并启动
* @param jobClassName 任务路径类名 如:com.wgu.job.NewJob
* @param jobGroupName 任务分组名
* @param cronExpression cron表达式
* @param jobDescription 任务描述
* @param params 携带参数
* @throws Exception
*/
public void addJob(String jobClassName, String jobGroupName, String cronExpression,
String jobDescription, Map<String, Object> params) throws Exception{
// 启动调度器
scheduler.start();
// 构建job信息
JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass())
.withIdentity(jobClassName, jobGroupName).withDescription(jobDescription).build();
Iterator<Map.Entry<String, Object>> var7 = params.entrySet().iterator();
var7.forEachRemaining(entry->
jobDetail.getJobDataMap().put(entry.getKey(), entry.getValue())
);
System.out.println("jobDetail数据:--------"+jobDetail.toString());
// 表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression);
// 按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName)
.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(jobDetail, trigger);
}
private static BaseJob getClass(String classname) throws Exception{
Class<?> class1 = Class.forName(classname);
return (BaseJob) class1.newInstance();
}
}
6.新建两个测试的定时任务
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
/**
* @Author: w
* @Date: 2019/9/17 16:07
* @Version 1.0
*/
@Slf4j
@NoArgsConstructor
public class HelloJob implements BaseJob{
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
log.error("Hello Job执行时间: " + new Date());
}
}
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.util.Date;
/**
* @Author: w
* @Date: 2019/9/17 16:07
* @Version 1.0
*/
@Slf4j
@NoArgsConstructor
public class NewJob implements BaseJob{
@Override
public void execute(JobExecutionContext context)
throws JobExecutionException {
log.error("New Job执行时间: " + new Date());
}
}
附写死的定时任务:
@Slf4j
@Component
@EnableScheduling //开启定时任务注解
public class MyJob {
@Scheduled(cron = "0 0 1-23 * * ?") //从1点开始每小时执行一次
public void addNum(){
log.info("从1点开始每小时执行一次");
}
@Scheduled(cron = "0 0 0 * * ? ") //每天0点执行更新
public void reset(){
log.info("每天0点执行更新");
}
@Scheduled(cron = "0 0/1 * * * ?") // 每分钟执行一次
public void run(){
log.info("每分钟执行一次");
}
}
7.调用就完事了。
service
package com.wgu.service;
import java.util.Map;
/**
* @Author: w
* @Date: 2019/9/17 15:25
* @Version 1.0
*/
public interface MyJobService {
/**
* 添加定时任务并启动
* @param jobClassName 类名
* @param jobGroupName 分组名
* @param cronExpression cron表达式
* @throws Exception
*/
void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception;
/**
* 暂停定时任务
* @param jobClassName 类名
* @param jobGroupName 分组名
* @throws Exception
*/
void pauseJob(String jobClassName, String jobGroupName) throws Exception;
/**
* 恢复定时任务
* @param jobClassName 类名
* @param jobGroupName 分组名
* @throws Exception
*/
void resumeJob(String jobClassName, String jobGroupName) throws Exception;
/**
* 删除定时任务
* @param jobClassName 类名
* @param jobGroupName 分组名
* @throws Exception
*/
void deleteJob(String jobClassName, String jobGroupName) throws Exception;
/**
* 更新定时任务并启动
* @param jobClassName 类名
* @param jobGroupName 分组名
* @param cronExpression cron表达式
* @throws Exception
*/
void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception;
/**
* 新增定时任务并启动
* @param jobClassName 类名
* @param jobGroupName 分组名
* @param cronExpression cron表达式
* @param jobDescription 任务描述
* @param params 携带参数
* @throws Exception
*/
void addJob(String jobClassName, String jobGroupName, String cronExpression, String jobDescription, Map<String, Object> params) throws Exception;
}
impl (注:加入数据库的步骤已略,请自行添加)
package com.wgu.service.impl;
import com.wgu.service.MyJobService;
import com.wgu.util.MyScheduler;
import org.springframework.stereotype.Service;
import java.util.Map;
/**
* @Author: w
* @Date: 2019/9/17 15:30
* @Version 1.0
*/
@Service
public class MyJobServiceImpl implements MyJobService {
private MyScheduler myScheduler = new MyScheduler();
@Override
public void addJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
myScheduler.addJob(jobClassName, jobGroupName, cronExpression);
}
@Override
public void pauseJob(String jobClassName, String jobGroupName) throws Exception {
myScheduler.pauseJob(jobClassName, jobGroupName);
}
@Override
public void resumeJob(String jobClassName, String jobGroupName) throws Exception {
myScheduler.resumeJob(jobClassName, jobGroupName);
}
@Override
public void deleteJob(String jobClassName, String jobGroupName) throws Exception {
myScheduler.deleteJob(jobClassName, jobGroupName);
}
@Override
public void updateJob(String jobClassName, String jobGroupName, String cronExpression) throws Exception {
myScheduler.updateJob(jobClassName, jobGroupName, cronExpression);
}
@Override
public void addJob(String jobClassName, String jobGroupName, String cronExpression, String jobDescription, Map<String, Object> params) throws Exception {
myScheduler.addJob(jobClassName, jobGroupName, cronExpression, jobDescription, params);
}
}
OK,完事了,去调用,去实现吧。