1.创建一个springboot 项目 (因为后面的Quartz需要数据库做持久化所以自己集成mysql)
2.引入Quartz需要的pom文件
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
3.添加Quartz配置内容
#定时任务调度器scheduler名字
spring.quartz.scheduler-name=weiQuartz
#持久化方式
spring.quartz.job-store-type=jdbc
#同样名字的job在插入到表中会报错,设置为true会覆盖之前相同名字的job
spring.quartz.overwrite-existing-jobs=true
#项目启动时是否自动创建数据库表never表示不创建表,always表示每次都会创建表
spring.quartz.jdbc.initialize-schema=never
#由于自带的sql脚本的注释为-,启动会报错,因此将自带的sql脚本注释改为#
spring.quartz.jdbc.comment-prefix=#
#关闭项目时,等待正在执行的定时任务执行完毕
spring.quartz.wait-for-jobs-to-complete-on-shutdown=true
#线程池
spring.quartz.properties.org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
#生成线程守护进程
spring.quartz.properties.org.quartz.threadPool.makeThreadsDaemons=true
#线程数量
spring.quartz.properties.org.quartz.threadPool.threadCount=10
#线程优先级
spring.quartz.properties.org.quartz.threadPool.threadPriority=5
4.创建一个jobUtils的工具类
import com.skyable.pma.entity.job.JobInfo;
import org.quartz.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
@Component
public class JobUtils {
@Autowired
private Scheduler scheduler;
public void addCronJob(JobInfo jobInfo) {
// 启动调度器
try {
scheduler.start();
} catch (SchedulerException e) {
System.out.println("启动调度器失败" + e);
}
//构建job信息
JobDetail jobDetail = null;
try {
jobDetail = JobBuilder.newJob(jobInfo.getJobClassName())
.withIdentity(jobInfo.getJobClassName().getSimpleName(), jobInfo.getJobGroupName()).build();
} catch (Exception e) {
System.out.println("创建job类失败" + e);
}
//表达式调度构建器(即任务执行的时间)
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder
.cronSchedule(jobInfo.getCronExpression());
//按新的cronExpression表达式构建一个新的trigger
CronTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity(jobInfo.getJobClassName().getSimpleName(), jobInfo.getJobGroupName())
.withSchedule(scheduleBuilder).build();
try {
scheduler.scheduleJob(jobDetail, trigger);
} catch (SchedulerException e) {
System.out.println("创建定时任务失败" + e);
}
}
}
5. 创建jobInfo
@Data
@AllArgsConstructor
@NoArgsConstructor
public class JobInfo {
private Class jobClassName; // 回调时的类
private String jobGroupName; // 这个为了区分组名的,可以存放一些唯一标识等,方便后面查询数据库
private String cronExpression; // cron 表达式
}
6. 书写对应的回调类
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.RequiredArgsConstructor;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.impl.JobDetailImpl;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.quartz.QuartzJobBean;
import org.springframework.stereotype.Component;
import java.util.Optional;
@Component
@RequiredArgsConstructor(onConstructor = @_(@Autowired))
public class JobAlarm extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
JobDetailImpl jobDetail = (JobDetailImpl) jobExecutionContext.getJobDetail();
String group = jobDetail.getGroup();
// 回调后的自己业务处理
.
.
.
}
}
7. 调用
public static void main(String[] args) {
JobInfo jobInfo = new JobInfo();
jobInfo.setJobClassName(JobAlarm.class);
jobInfo.setCronExpression(DateUtil.getCron(new Date()));
jobInfo.setJobGroupName("1");
// 这一步一定要是注入的 我只是简单演示
JobUtils jobUtils = new JobUtils();
jobUtils.addCronJob(jobInfo);
}
/***
* 功能描述:日期转换cron表达式
* @param date
* @param dateFormat : e.g:yyyy-MM-dd HH:mm:ss
* @return
*/
public static String formatDateByPattern(Date date,String dateFormat){
SimpleDateFormat sdf = new SimpleDateFormat(dateFormat);
String formatTimeStr = null;
if (date != null) {
formatTimeStr = sdf.format(date);
}
return formatTimeStr;
}
/***
* convert Date to cron ,eg. "0 07 10 15 1 ? 2016"
* @param date : 时间点
* @return
*/
public static String getCron(Date date){
String dateFormat="ss mm HH dd MM ? yyyy";
return formatDateByPattern(date, dateFormat);
}