Quartz说明
定时任务主要使用它的三大组件。
- 调度器:Scheduler。
- 任务:JobDetail。
- 触发器:Trigger,包括 SimpleTrigger 和 CronTrigger。
使用流程:
- 创建任务:具体的业务逻辑,需要实现Job接口,将业务逻辑代码存放在
void execute(JobExecutionContext context)
方法中。 - 定时执行任务:将任务创建好后,定时执行它,需要用到Quartz的三大组件:
- JobDetail用来绑定Job,并设置任务的相关属性
- Trigger指定Job的执行时间,执行间隔,运行次数等
- Schedule来负责调度结合JobDetail和Trigger
实战演练
- pom.xml 导入相关依赖【springboot和Quartz】
<dependencies>
<!--springboot相关依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.5.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>2.5.1</version>
</dependency>
<!--quartz-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
<version>2.5.1</version>
</dependency>
</dependencies>
- application.yml 【不需要配置】
- QuartzApplication启动类
@SpringBootApplication
public class QuartzApplication {
public static void main(String[] args) {
SpringApplication.run(QuartzApplication.class, args);
System.out.println("QuartzApplication启动成功");
}
}
- 任务:DemoJob【需要定时开启的任务】
/**
* <h3>DemoJob</h3>
* <p>定时任务</p>
*
* @author : he zhe
* @date : 2022-07-29 14:26
**/
public class DemoJob implements Job {
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//获取JobDetail中传递的参数
String url = (String) jobExecutionContext.getJobDetail().getJobDataMap().get("url");
//获取当前时间
Date date = new Date();
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//打印信息
System.out.println("当前时间:" + dateFormat.format(date)+" 用户:"+new Random().nextInt(100)+" 访问了"+url);
System.out.println("----------------------------------------");
}
}
- 工具类:JobUtils【开启和关闭定时任务方法封装】
/**
* <h3>JobUtils</h3>
* <p>任务调度工具类</p>
*
* @author : he zhe
* @date : 2022-07-29 14:49
**/
public class JobUtils {
private static SchedulerFactory schedulerFactory;
private static void setSchedulerFactory(){
schedulerFactory = new StdSchedulerFactory();
}
public static void open(String className, String jobId){
if (schedulerFactory == null) {
setSchedulerFactory();
}
try {
// 1、创建调度器Scheduler
Scheduler scheduler = schedulerFactory.getScheduler();
// 2、创建JobDetail实例,并与Job类绑定(Job执行内容)
className = "com.study.job."+className;
Class forName = Class.forName(className);
JobDetail jobDetail = JobBuilder.newJob(forName)
.withIdentity(jobId)
.usingJobData("url","https://blog.csdn.net/qq_43466788")
.build();
// 3、构建Trigger实例,每隔1s执行一次
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "triggerGroup1")
.startNow()//立即生效
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(1)//每隔1s执行一次
.repeatForever()).build();//一直执行
//4、执行
scheduler.scheduleJob(jobDetail, trigger);
System.out.println("--------scheduler start ! ------------");
scheduler.start();
} catch (Exception e) {
e.printStackTrace();
}
}
public static void close(String jobId) {
try {
// 任务全部使用同一个调度器
Scheduler scheduler = null;
// 获取调度器
scheduler = schedulerFactory.getScheduler();
JobKey jobKey = JobKey.jobKey(jobId);
// 添加到调度器
scheduler.deleteJob(jobKey);
System.out.println("--------scheduler shutdown ! ------------");
} catch (Exception e) {
e.printStackTrace();
}
}
}
- 接口:DemoJobController【控制定时任务开启关闭】
@RestController
public class DemoJobController {
@RequestMapping(value = "/open", method = RequestMethod.POST)
public String test(String className) {
//开启定时任务
JobUtils.open(className,"1");
return "定时任务启动成功";
}
@RequestMapping(value = "/close", method = RequestMethod.POST)
public String test2(String jobId) {
//开启定时任务
JobUtils.close(jobId);
return "定时任务关闭成功";
}
}
- 启动服务
访问:http://localhost:80/open?className=DemoJob
然后就可以在控制台看到:【不停的打印】
访问:POST http://localhost:80/close?jobId=1
控制台打印scheduler shutdown !后,停止了定时任务