spring-boot-route(二十一)quartz实现动态定时任务

Quartz是一个定时任务的调度框架,涉及到的主要概念有以下几个:

Scheduler:调度器,所有的调度都由它控制,所有的任务都由它管理。

Job:任务,定义业务逻辑。

JobDetail:基于Job,进一步封装。其中关联一个Job,并为Job指定更详细的信息。

Trigger:触发器,可以指定给某个任务,指定任务的触发机制。

一 创建简单任务

1.1 Quartz依赖

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-quartz</artifactId>

</dependency>

1.2 创建任务

任务创建需要实现Job接口,重写execute(JobExecutionContext jobExecutionContext)方法,增加定时任务的业务逻辑,这里我只是简单的打印一下定时任务执行。

@Slf4j

public class SimpleJob implements Job {

@Override

public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {

log.info("job execute---"+new Date());

}

}

1.3 JobDetail增加属性

这里增加的属性可以在Job实现类中获取,来处理业务。

JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)

// 任务标识,及任务分组

.withIdentity("job1", "group1")

// 链接调用,增加需要的参数

.usingJobData("name","Java旅途")

.usingJobData("age",18)

.build();

1.4 Trigger实现

Trigger分为两种,SimpleTriggerCronTriggerSimpleTrigger是根据Quartz的一些api实现的简单触发行为。CronTrigger用的比较多,使用cron表达式进行触发。这里先用SimpleTrigger来实现。

SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger()

.withIdentity("trigger1", "group1")

// 立即执行

.startNow()

// 10s后停止

.endAt(new Date(System.currentTimeMillis()+10*1000))

.withSchedule(

SimpleScheduleBuilder.simpleSchedule()

// 每秒执行一次

.withIntervalInSeconds(1)

// 一直执行

.repeatForever()

).build();

1.5 启动任务

@Autowired

private Scheduler scheduler;

scheduler.scheduleJob(jobDetail,simpleTrigger);

1.6 执行效果

启动项目后,任务立即执行,每秒执行一次,10s后停止,执行效果图如下:

spring-boot-route(二十一)quartz实现动态定时任务

二 动态操作定时任务

有时候除了已经开发好的定时任务外,还需要我们手动去创建任务并且控制任务的执行。

2.1 创建任务

@GetMapping("create")

public void createJob(String jobName,String jobGroup,String cron,String triggerName,String triggerGroup) throws SchedulerException {

JobKey jobKey = new JobKey(jobName,jobGroup);

// 如果存在这个任务,则删除

if(scheduler.checkExists(jobKey)) {

scheduler.deleteJob(jobKey);

}

JobDetail jobDetail = JobBuilder.newJob(SimpleJob.class)

.withIdentity(jobKey)

.build();

CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cron);

Trigger trigger = TriggerBuilder.newTrigger()

.withIdentity(triggerName,triggerGroup)

.withSchedule(cronScheduleBuilder).build();

scheduler.scheduleJob(jobDetail,trigger);

}

2.2 暂停任务

@GetMapping("pause")

public void pauseJob(String jobName,String jobGroup) throws SchedulerException {

JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

JobDetail jobDetail = scheduler.getJobDetail(jobKey);

if (jobDetail == null) {

return;

}

scheduler.pauseJob(jobKey);

}

2.3 恢复暂停的任务

@GetMapping("remuse")

public void remuseJob(String jobName, String jobGroup) throws SchedulerException {

JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

JobDetail jobDetail = scheduler.getJobDetail(jobKey);

if (jobDetail == null) {

return;

}

scheduler.resumeJob(jobKey);

}

2.4 删除定时任务

@GetMapping("remove")

public void removeJob(String jobName, String jobGroup,String triggerName,String triggerGroup) throws SchedulerException {

TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroup);

JobKey jobKey = JobKey.jobKey(jobName, jobGroup);

Trigger trigger = scheduler.getTrigger(triggerKey);

if (trigger == null) {

return;

}

// 停止触发器

scheduler.pauseTrigger(triggerKey);

// 移除触发器

scheduler.unscheduleJob(triggerKey);

// 删除任务

scheduler.deleteJob(jobKey);

}

三 任务持久化

Quartz默认使用RAMJobStore存储方式将任务存储在内存中,除了这种方式还支持使用JDBC将任务存储在数据库,为了防止任务丢失,我们一般会将任务存储在数据库中。

这里使用mysql进行存储,在quartz的源码包中找到文件tables_mysql_innodb.sql,然后在客户端进行运行sql文件。如果嫌源码包不好下载的话,我已经将sql文件上传至GitHub了,可以直接访问github拉去表结构,数据表如下:

spring-boot-route(二十一)quartz实现动态定时任务

3.1 增加mysql和jdbc依赖

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>8.0.11</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-jdbc</artifactId>

</dependency>

3.2 指定使用jdbc存储

quartz默认使用memory存储,这里修改成jdbc进行存储,并配置jdbc的相关信息

spring:

quartz:

job-store-type: jdbc

datasource:

driver-class-name: com.mysql.cj.jdbc.Driver

url: jdbc:mysql://localhost:3306/simple_fast

username: root

password: root

3.3 创建任务

启动项目,调用create接口创建任务,然后数据表中就会新增任务相关的数据了。

spring-boot-route(二十一)quartz实现动态定时任务


本文示例代码已上传至github,点个star支持一下!

Spring Boot系列教程目录

spring-boot-route(一)Controller接收参数的几种方式

spring-boot-route(二)读取配置文件的几种方式

spring-boot-route(三)实现多文件上传

spring-boot-route(四)全局异常处理

spring-boot-route(五)整合swagger生成接口文档

spring-boot-route(六)整合JApiDocs生成接口文档

spring-boot-route(七)整合jdbcTemplate操作数据库

spring-boot-route(八)整合mybatis操作数据库

spring-boot-route(九)整合JPA操作数据库

spring-boot-route(十)多数据源切换

spring-boot-route(十一)数据库配置信息加密

spring-boot-route(十二)整合redis做为缓存

spring-boot-route(十三)整合RabbitMQ

spring-boot-route(十四)整合Kafka

spring-boot-route(十五)整合RocketMQ

spring-boot-route(十六)使用logback生产日志文件

spring-boot-route(十七)使用aop记录操作日志

spring-boot-route(十八)spring-boot-adtuator监控应用

spring-boot-route(十九)spring-boot-admin监控服务

spring-boot-route(二十)Spring Task实现简单定时任务

spring-boot-route(二十一)quartz实现动态定时任务

spring-boot-route(二十二)实现邮件发送功能

spring-boot-route(二十三)开发微信公众号

这个系列的文章都是工作中频繁用到的知识,学完这个系列,应付日常开发绰绰有余。如果还想了解其他内容,扫面下方二维码告诉我,我会进一步完善这个系列的文章!

spring-boot-route(二十一)quartz实现动态定时任务

以上是 spring-boot-route(二十一)quartz实现动态定时任务 的全部内容, 来源链接: utcz.com/a/65246.html

回到顶部