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后停止,执行效果图如下:

二 动态操作定时任务

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

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接口创建任务,然后数据表中就会新增任务相关的数据了。

此是spring-boot-route系列的第二十一篇文章,这个系列的文章都比较简单,主要目的就是为了帮助初次接触Spring Boot 的同学有一个系统的认识。本文已收录至我的github,欢迎各位小伙伴star

githubhttps://github.com/binzh303/spring-boot-route

点关注、不迷路

如果觉得文章不错,欢迎关注点赞收藏,你们的支持是我创作的动力,感谢大家。

如果文章写的有问题,请不要吝惜文笔,欢迎留言指出,我会及时核查修改。

如果你还想更加深入的了解我,可以微信搜索「Java旅途」进行关注。回复「1024」即可获得学习视频及精美电子书。每天7:30准时推送技术文章,让你的上班路不在孤独,而且每月还有送书活动,助你提升硬实力!

spring-boot-route(二十一)quartz实现动态定时任务的更多相关文章

  1. Spring Boot 2 (二):Spring Boot 2 动态 Banner

    Spring Boot 2 (二):Spring Boot 2 动态 Banner Spring Boot 2.0 提供了很多新特性,其中就有一个小彩蛋:动态 Banner. 一.配置依赖 使用 Sp ...

  2. Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 页面

    Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 页面 在<Spring Boot(一):快速开始>中介绍了如何使用 Spring Boot 构建一个工程,并且提 ...

  3. Spring Boot 2.X(十一):全局异常处理

    前言 在 Java Web 系统开发中,不管是 Controller 层.Service 层还是 Dao 层,都有可能抛出异常.如果在每个方法中加上各种 try catch 的异常处理代码,那样会使代 ...

  4. spring boot / cloud (二) 规范响应格式以及统一异常处理

    spring boot / cloud (二) 规范响应格式以及统一异常处理 前言 为什么规范响应格式? 我认为,采用预先约定好的数据格式,将返回数据(无论是正常的还是异常的)规范起来,有助于提高团队 ...

  5. spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求

    spring boot / cloud (二十) 相同服务,发布不同版本,支撑并行的业务需求 有半年多没有更新了,按照常规剧本,应该会说项目很忙,工作很忙,没空更新,吧啦吧啦,相关的话吧, 但是细想想 ...

  6. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  7. Spring AOP动态代理实现,解决Spring Boot中无法正常启用JDK动态代理的问题

    Spring AOP底层的动态代理实现有两种方式:一种是JDK动态代理,另一种是CGLib动态代理. JDK动态代理 JDK 1.3版本以后提供了动态代理,允许开发者在运行期创建接口的代理实例,而且只 ...

  8. Spring Boot入门系列(八)整合定时任务Task,一秒搞定定时任务

    前面介绍了Spring Boot 中的整合Redis缓存已经如何实现数据缓存功能.不清楚的朋友可以看看之前的文章:https://www.cnblogs.com/zhangweizhong/categ ...

  9. (转)Spring Boot 2 (二):Spring Boot 2 尝鲜-动态 Banner

    http://www.ityouknow.com/springboot/2018/03/03/spring-boot-banner.html Spring Boot 2.0 提供了很多新特性,其中就有 ...

随机推荐

  1. display值的分类

    整体来讲,display的值可以分为6个大类,1个全局类,一共是7大类: 外部值 内部值 列表值 属性值 显示值 混合值 全局值 外部值,指的是这些值只会直接影响一个元素的外部表现,而不影响元素里面的 ...

  2. 关于JAVA的一些零碎小知识

    1.经常遇到集合之间需要互相转化的 Array和List转化:Arrays.asList(数组):list.toArray(); List和Set转化:Set<String> set = ...

  3. TB级倾斜模型加载速度太慢?这是我见过最快的加载方式没有之一

    随着无人机性能快速提升,单个项目涉及到的倾斜摄影模型数据范围.数据量及单个模型体积也在不断变大,带来的问题是数据显示速度却越来越慢,那么如何在不升级配置的情况下提升模型的加载速度呢?   TB级倾斜摄 ...

  4. Redis学习(一)认识并安装redis

    一.初识redis Redis是一个开源的Key-Value数据库,通常被称为数据结构服务器,其值可以是多种常见的数据格式,且读写性能极高,且所有操作都是原子性的. Redis是运行在内存中的,但是可 ...

  5. 转载:pycharm IDE 导入自定义模块

    http://www.mamicode.com/info-detail-2241193.html

  6. 帮你理清React的生命周期

    这是一个从印记中文 | react官方文档提取总结的,算是帮自己理清并且强化记忆React的生命周期,以便以后编写组件的时候能够有更清晰的思路.本文如有纰漏,欢迎指正 整体上来讲,React生命周期分 ...

  7. RabbitMQ小记(二)

    1.RabbitMQ相关介绍 (1)RabbitMQ整体上是一个生产者和消费者模型,主要负责接收.存储.转发消息.RabbitMQ整体结构图如下: (2)生产者:发送消息的一方,生产者创建一条消息,发 ...

  8. 使用maven整合mybatis时出现org.apache.ibatis.binding.BindingException: Invalid bound statement (not found)

    分析原因是mybatis的映射文件的问题,首先进行分析排查: 1.检查mapper接口和对应的xml文件的包名是否对应 2.检查xml文件的namespace与mapper接口的包名是否对应 3.检查 ...

  9. 高效学习必备软件:OneNote+ Mindmaster

    做笔记有两个关键点: 一是笔记内容详略得当.二是知识的框架清晰完整. 为什么这样说? 举个例子,如图是我的笔记界面,用的是免费的OneNote, OneNote是微软出的笔记软件, 非常好用,有着书写 ...

  10. 【题解】[AHOI2013]作业

    Link 题目大意:\(n\)个数,\(m\)个询问,每次四个参数,\(l,r,a,b\),问区间\([l,r]\)中出现过的,数值在\([a,b]\)区间中的数的个数以及区间\([l,r]\)中数值 ...