引入jar
<!--引入定时任务-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
1.配置信息
package com.qdwy.qudaowuyoutask.util.quartz;
import lombok.extern.slf4j.Slf4j;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.context.annotation.Configuration;
import java.util.Date;
/**
* @Author zbf
* @DATA 2019/11/21 15:40
* @ClassIntroduction
*/
@Slf4j
@Configuration
public class QuartzConfig {
/**
* 任务调度
*/
private static Scheduler scheduler=null;
public QuartzConfig() {
try {
scheduler = new StdSchedulerFactory().getScheduler();
log.info("初始化调度器 ");
} catch (SchedulerException ex) {
log.error("初始化调度器=> [失败]:" + ex.getLocalizedMessage());
}
}
/**
* 启动定时任务
*/
public void start() {
try {
scheduler.start();
log.info("启动调度器 ");
} catch (SchedulerException e) {
log.error(e.getMessage(),e);
log.error("启动调度器=> [失败]");
}
}
/**
* 新增定时任务
* @param name 定时任务的名称
* @param group 定时任务分组
* @param clazz 需要执行的定时任务类
* @param cronExpression cron 表达式
*/
public void addJob(String name, String group, Class<? extends Job> clazz, String cronExpression) {
try {
//构造任务
JobDetail jobDetail= JobBuilder.newJob(clazz)
.withIdentity(name,group)
.build();
CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder
.cronSchedule(cronExpression);
//构造任务触发器
CronTrigger cronTrigger=TriggerBuilder
.newTrigger().withIdentity(name,group)
.withSchedule(cronScheduleBuilder).build();
//将作业添加到调度器
scheduler.scheduleJob(jobDetail,cronTrigger);
} catch (SchedulerException e) {
log.error(e.getMessage(),e);
log.error("创建作业=> [作业名称:" + name + " 作业组:" + group + "]=> [失败]");
}
}
/**
* 获取Job信息
* @param name
* @param group
*/
public String getjobInfo(String name,String group) throws SchedulerException {
TriggerKey triggerKey=new TriggerKey(name,group);
CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
return String.format("time:%s,state:%s",cronTrigger.getCronExpression(),
scheduler.getTriggerState(triggerKey).name());
}
/**
* 修改任务的执行时间
* @param name
* @param group
* @param cron cron表达式
* @return
* @throws SchedulerException
*/
public boolean modifyJob(String name,String group,String cron) throws SchedulerException{
Date date=null;
TriggerKey triggerKey=new TriggerKey(name, group);
CronTrigger cronTrigger= (CronTrigger) scheduler.getTrigger(triggerKey);
String oldTime=cronTrigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(cron)){
CronScheduleBuilder cronScheduleBuilder=CronScheduleBuilder.cronSchedule(cron);
CronTrigger trigger=TriggerBuilder.newTrigger().withIdentity(name,group)
.withSchedule(cronScheduleBuilder).build();
date=scheduler.rescheduleJob(triggerKey,trigger);
}
return date !=null;
}
/**
* 暂停所有任务
* @throws SchedulerException
*/
public void pauseAllJob()throws SchedulerException{
scheduler.pauseAll();
}
/**
* 暂停某个任务
* @param name
* @param group
* @throws SchedulerException
*/
public void pauseJob(String name,String group)throws SchedulerException{
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
if (jobDetail==null)
return;
scheduler.pauseJob(jobKey);
}
/**
* 恢复所有任务
* @throws SchedulerException
*/
public void resumeAllJob()throws SchedulerException{
scheduler.resumeAll();
}
/**
* 恢复某个任务
*/
public void resumeJob(String name,String group)throws SchedulerException{
JobKey jobKey=new JobKey(name,group);
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
if (jobDetail==null)
return;
scheduler.resumeJob(jobKey);
}
/**
* 删除某个任务
* @param name
* @param group
* @throws SchedulerException
*/
public void deleteJob(String name,String group)throws SchedulerException{
JobKey jobKey=new JobKey(name, group);
JobDetail jobDetail=scheduler.getJobDetail(jobKey);
if (jobDetail==null)
return;
scheduler.deleteJob(jobKey);
}
}
2.和数据库进行交互
package com.qdwy.qudaowuyoutask.util.quartz;
import com.qdwy.qudaowuyou.common.constant.QdwyConstant;
import com.qdwy.qudaowuyoubusiness.business.system.QdwyQuartzService;
import com.qdwy.qudaowuyoubusiness.system.entity.SysQuartz;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections.CollectionUtils;
import org.quartz.Job;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
import java.util.List;
/**
* @Author zbf
* @DATA 2019/11/21 16:04
* @ClassIntroduction
*/
@Slf4j
@Configuration
public class QuartzListener implements ApplicationListener<ContextRefreshedEvent> {
@Autowired
private QuartzConfig quartzConfig;
@Autowired
private QdwyQuartzService quartzService;
@Override
public void onApplicationEvent(ContextRefreshedEvent contextRefreshedEvent) {
try {
//1.查询所有的定时任务信息
List<SysQuartz> sysQuartz = quartzService.getSysQuartz(QdwyConstant.QDWY_QUARTZ_START);
if (CollectionUtils.isNotEmpty(sysQuartz)){
Job job = null;
for (SysQuartz quartz : sysQuartz) {
//根据类路径创建工作对象
job = (Job) Class.forName(quartz.getQuartzClass()).newInstance();
//将工作任务放入工作空间 quartzConfig.addJob(quartz.getQuartzClass(),quartz.getQuartzGroup(),job.getClass(),quartz.getQuartzCron());
}
//启动定时任务
quartzConfig.start();
log.info("[启动定时任务结束...]");
}
log.info("[没有可执行的定时任务]");
} catch (Exception e) {
log.info("启动定时任务异常"+e.getMessage(),e);
}
}
}
3.执行自己的job
package com.qdwy.qudaowuyoutask.task;
import com.qdwy.qudaowuyoubusiness.business.system.QdwyQuartzService;
import com.qdwy.qudaowuyoubusiness.system.entity.SysQuartz;
import com.qdwy.qudaowuyoubusiness.system.entity.SysQuartzLog;
import com.qdwy.qudaowuyoutask.util.bean.QdwyBeanUtil;
import lombok.extern.slf4j.Slf4j;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.time.LocalDateTime;
/**
* @Author zbf
* @DATA 2019/11/21 15:45
* @ClassIntroduction
*/
@Slf4j
public class MyJob1 implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
test();
}
public void test(){
QdwyQuartzService quartzService = QdwyBeanUtil.getBean(QdwyQuartzService.class);
进行业务逻辑处理
log.info("定时任务需要执行================......");
}
}
4.注意:
spring boot 中不能直接在实现job的接口引用spring容器中的对象
解决方法:
1.将spring 容器公有,可以拿到spring 容器
2.建立自己可以获取spring容器中工具
package com.qdwy.qudaowuyoutask.util.bean;
import org.springframework.context.ConfigurableApplicationContext;
/**
* @Author zbf
* @DATA 2019/11/21 18:29
* @ClassIntroduction
*/
public class QdwyBeanUtil {
//将管理上下文的applicationContext设置成静态变量,供全局调用
public static ConfigurableApplicationContext applicationContext;
//定义一个获取已经实例化bean的方法
public static <T> T getBean(Class<T> c){
return applicationContext.getBean(c);
}
}