springboot集成动态任务调度,springboot集成动态quartz调度
一、静态任务和动态任务区别
大家经常使用注解:@Scheduled(cron=“0/5 * * * * ?”)
每5秒钟执行一次,很多场景下是需要动态的新增调度任务,比如提交订单后30分钟内未支付则自动取消订单。动态任务就是为了实现这样的场景。
二、首先添加pom和创建配置类
添加pom
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
创建配置类
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 ScheduConfigure {
/**
* 初始注入scheduler
* @return
* @throws SchedulerException
*/
@Bean
public Scheduler scheduler() throws SchedulerException {
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}
三、然后实现Job接口,实现其方法
import org.quartz.Job;
import org.quartz.JobDetail;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class MyScheduler implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("任务开始执行");
//获取job对象
JobDetail jobDetail = jobExecutionContext.getJobDetail();
//创建任务时候 传入的参数对象
Object orderNo = jobDetail.getJobDataMap().get("orderNo");
//job对象内无法注入 service对象,可以在创建任务时候把对象传进来,调用service
OrderService service = (OrderService)jobDetail.getJobDataMap().get("service");
//执行订单的任务逻辑
service.cancelOrder(orderNo);
System.out.println("任务结束执行");
}
}
四、创建jobDetail、trigger、启动任务
@Service
public class JobService {
@Autowired
private OrderService service;
@Resource
private Scheduler scheduler;
public void startJob(){
//创建job 指定job类型为MyScheduler.class。 name和group两个参数一起来判定是否是一个job
JobDetail jobDetail = JobBuilder.newJob(MyScheduler.class).withIdentity("name", "group").build();
jobDetail.getJobDataMap().put("orderNo","123");//传入参数
jobDetail.getJobDataMap().put("service","service"); //job实现类内无法 使用 注入,所以可以传入service对象
Date date = DateUtils.str2Date("2022-03-25 17:18:50", new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"));
//创建SimpleTrigger
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("name", "group")
.startAt(date)//设置一个执行任务时间
.withSchedule(SimpleScheduleBuilder.simpleSchedule())
// .withIntervalInMilliseconds(0)//指定一个重复间隔,以毫秒为单位,这里注释掉,代表执行一次就不再执行了
// .withRepeatCount(0))//指定重复的次数
.build();
//另一种trigger实现
// CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0 0/5 * * * ?");
// CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("job2", "group2")
// .withSchedule(cronScheduleBuilder).build();
try {
scheduler.scheduleJob(jobDetail,trigger);
//判断是否启动
boolean started = scheduler.isStarted();
if(!started){
scheduler.start();
}
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
五、job的一些其他方法
/**
* 获取Job信息
*
* @param name
* @param group
* @return
* @throws SchedulerException
*/
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 time
* @return
* @throws SchedulerException
*/
public boolean modifyJob(String name, String group, String time) throws SchedulerException {
Date date = null;
TriggerKey triggerKey = new TriggerKey(name, group);
CronTrigger cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);
String oldTime = cronTrigger.getCronExpression();
if (!oldTime.equalsIgnoreCase(time)) {
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(time);
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();
}
/**
* 恢复某个任务
*
* @param name
* @param group
* @throws SchedulerException
*/
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);
}