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分为两种,SimpleTrigger
和CronTrigger
。SimpleTrigger
是根据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后停止,执行效果图如下:
二 动态操作定时任务
有时候除了已经开发好的定时任务外,还需要我们手动去创建任务并且控制任务的执行。
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拉去表结构,数据表如下:
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
接口创建任务,然后数据表中就会新增任务相关的数据了。
< END >
此是spring-boot-route系列的第二十一篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。本文及代码已上传至我的github
,欢迎各位小伙伴star
!点击文末的阅读原文即可到达github
仓库!
github:https://github.com/binzh303/spring-boot-route
- hdu 3853LOOPS (概率DP)
- cf(#div1 B. Dreamoon and Sets)(数论)
- hdu 1805Expressions(二叉树构造的后缀表达式)
- 清空messages没有权限的解决方法
- hdu1710(Binary Tree Traversals)(二叉树遍历)
- 基本线程同步(一) 同步方法
- uva514(trail)(模拟栈)
- zoj3822 Domination(概率dp)
- Veeam Backup & Replication(三):创建备份与还原备份
- 使用Go开发一个简单的服务器程序
- C++ 与设计模式学习(其一)
- xz文件压缩工具的用法
- Java 中正确使用 hashCode 和 equals 方法
- C/C++ 关于生成静态库(lib)/动态库(dll)文件如何使用(基于windows基础篇)
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- python富文本XSS过滤器
- PHP Multipart/form-data remote DOS 防御方案研究
- Kubernetes Python Client
- 对JiaThis Flash XSS的挖掘与分析
- Spark 3.0.1 Structured Streaming 提交程序异常解决
- 一起来探索下小程序包的魔数
- 新浪微博IPAD客户端XSS(file域) + 构造Worm
- Firefox 31~34远程命令执行漏洞的分析
- emlog绕过验证码刷评论
- cmseasy最新注入+360webscan的绕过分析
- 新型任意文件读取漏洞的研究
- Chrome XSS Auditor Bypass Using SVG
- ngx_lua_waf针对性改写
- Wordpress < 4.1.2 存储型XSS分析与稳定POC
- 重构Sec-News之路