SpringBoot 集成 Quartz 定时器
今天,日月教大家如何使用springBoot集成Quartz(定时器),沿用的springboot少xml配置的优良传统,本身支持表达式等多种定时任务 。
为什么要使用Quartz
多任务情况下,quartz更容易管理,可以实现动态配置
集成Quartz
1、maven依赖
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.2.1</version>
</dependency>
2、测试Job类
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
/**
*
* @ClassName: SchedulerQuartzJobUpOffLine
* @Description: 实现Job接口 监听服务上下线的定时器
* @author chenqi
* @date 2018年9月4日
*
*/
public class SchedulerQuartzJobTest implements Job{
private SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
private void before(){
System.out.println("任务开始执行-" + dateFormat.format(new Date()));
}
@Override
public void execute(JobExecutionContext arg0) throws JobExecutionException {
before();
System.out.println("业务逻辑。。。");
after();
}
private void after(){
System.out.println("任务执行结束");
}
}
3、定时器管理类
package com.chenqi.springBootQuartz.quartz;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.JobKey;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.TriggerBuilder;
import org.quartz.TriggerKey;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import com.chenqi.springBootQuartz.quartz.job.SchedulerQuartzJobTest;
/**
*
* @ClassName: QuartzScheduler
* @Description: 任务调度处理
* @author chenqi
* @date 2018年9月4日
*
*/
@Configuration
public class QuartzSchedulerManager {
// 任务调度
@Autowired
private Scheduler scheduler;
/**
* 开始执行定时器
*
* @throws SchedulerException
*/
public void startJob() throws SchedulerException {
startJobTest(scheduler);
scheduler.start();
}
/**
* 获取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);
}
/**
*
* @Title: startJobTest
* @Description: 启动 定时器 test
* @param scheduler
* @throws SchedulerException 参数
* void 返回类型
*/
private void startJobTest(Scheduler scheduler) throws SchedulerException {
// 通过JobBuilder构建JobDetail实例,JobDetail规定只能是实现Job接口的实例
// JobDetail 是具体Job实例
JobDetail jobDetail = JobBuilder.newJob(SchedulerQuartzJobTest.class).withIdentity("job1", "group1").build();
// 基于表达式构建触发器
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("0/5 * * * * ?");
// CronTrigger表达式触发器 继承于Trigger
// TriggerBuilder 用于构建触发器实例
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("job1", "group1")
.withSchedule(cronScheduleBuilder).build();
scheduler.scheduleJob(jobDetail, cronTrigger);
}
}
4、定时器初始化类
package com.chenqi.springBootQuartz.quartz;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.event.ContextRefreshedEvent;
/**
*
* @ClassName: ApplicationStartQuartzJobListener
* @Description: 服务启动 初始化定时器
* @author chenqi
* @date 2018年9月5日
*
*/
@Configuration
public class ApplicationStartQuartzJobListener implements ApplicationListener<ContextRefreshedEvent>{
@Autowired
private QuartzSchedulerManager quartzSchedulerManager;
/**
* 初始启动quartz
*/
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
try {
quartzSchedulerManager.startJob();
System.out.println("任务已经启动...");
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
* 初始注入scheduler
* @return
* @throws SchedulerException
*/
@Bean
public Scheduler scheduler() throws SchedulerException{
SchedulerFactory schedulerFactoryBean = new StdSchedulerFactory();
return schedulerFactoryBean.getScheduler();
}
}
5、封装api
package com.chenqi.springBootQuartz.controller;
import org.quartz.SchedulerException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.chenqi.springBootQuartz.quartz.QuartzSchedulerManager;
/**
*
* @ClassName: QuartzController
* @Description: 定时器api
* @author chenqi
* @date 2018年9月18日
*
*/
@RestController
@RequestMapping("/quartz")
public class QuartzController {
@Autowired
private QuartzSchedulerManager quartzSchedulerManager;
/**
*
* @Title: startQuartzJob
* @Description: 启动所有定时器
* @return void
*/
@RequestMapping("/start")
public void startQuartzJob() {
try {
quartzSchedulerManager.startJob();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
*
* @Title: getQuartzJob
* @Description: 获取定时器信息
* @param name
* @param group
* @return
* @return String
*/
@RequestMapping("/info")
public String getQuartzJob(String name, String group) {
String info = null;
try {
info = quartzSchedulerManager.getJobInfo(name, group);
} catch (SchedulerException e) {
e.printStackTrace();
}
return info;
}
/**
*
* @Title: modifyQuartzJob
* @Description: 修改定时器的 执行时间
* @param name
* @param group
* @param time
* @return
* @return boolean
*/
@RequestMapping("/modify")
public boolean modifyQuartzJob(String name, String group, String time) {
boolean flag = true;
try {
flag = quartzSchedulerManager.modifyJob(name, group, time);
} catch (SchedulerException e) {
e.printStackTrace();
}
return flag;
}
/**
*
* @Title: pauseQuartzJob
* @Description: 暂停指定 定时器
* @param name
* @param group
* @return void
*/
@RequestMapping(value = "/pause")
public void pauseQuartzJob(String name, String group) {
try {
quartzSchedulerManager.pauseJob(name, group);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
*
* @Title: pauseAllQuartzJob
* @Description: 暂停所有定时器
* @return void
*/
@RequestMapping(value = "/pauseAll")
public void pauseAllQuartzJob() {
try {
quartzSchedulerManager.pauseAllJob();
} catch (SchedulerException e) {
e.printStackTrace();
}
}
/**
*
* @Title: deleteJob
* @Description: 删除指定定时器
* @param name
* @param group
* @return void
*/
@RequestMapping(value = "/delete")
public void deleteJob(String name, String group) {
try {
quartzSchedulerManager.deleteJob(name, group);
} catch (SchedulerException e) {
e.printStackTrace();
}
}
}
6、启动测试
启动类:
package com.chenqi.springBootQuartz;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
public class SpringBootQuartzApplication {
public static void main(String[] args) {
SpringApplication.run(SpringBootQuartzApplication.class, args);
}
}
定时器正常启动执行,我们试试通过API修改定时器执行时间
浏览器访问:
http://localhost:8080/quartz/modify?name=job1&group=group1&time=0/10 * * * * ?
定时器执行间隔改为10秒执行一次,查看控制台日志
可以看到,修改成功,至此,springBoot 集成 quartz完成,并实现了api动态管理。
还没有评论,来说两句吧...