SpringBoot第十七篇:定时任务
作者:追梦1819
原文:https://www.cnblogs.com/yanfei1819/p/11076555.html
版权声明:本文为博主原创文章,转载请附上博文链接!
引言
相信大家对定时任务很熟悉,其重要性也不言而喻。定时发短信、定时批量操作、定时统计数据等,都离不开定时任务。本文将讲解定时任务在 SpringBoot 项目中的应用。
版本信息
- JDK:1.8
- SpringBoot :2.0.1.RELEASE
- maven:3.3.9
- IDEA:2019.1.1
- quartz:2.3.0
定时任务实现方式
JDK自带的Timer
Timer 是Java 自带的定时任务类。可以用作比较简单的定时任务。通常用的不多。下面以一个小的示例展示其用法。
SpringBoot集成的schedule
这种方式是 SpringBoot 集成的,使用很简单。
首先,引入 SpringBoot 的基础 jar:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
然后再启动类中添加注解 @EnableScheduling 即可开启 SpringBoot 定时任务:
@SpringBootApplication
@EnableScheduling
public class TimedTaskDemoApplication {
public static void main(String[] args) {
SpringApplication.run(TimedTaskDemoApplication.class, args);
}
}
下面根据 @Scheduled 的不同属性创建几个任务:
任务一:
@Component
public class FirstTask {
/**
* cron 表达式
*/
// @Scheduled(cron = "0/2 * * * * *")
@Scheduled(cron="${cron.schedule}")
public void run(){
System.out.println("这是创建的第一个定时任务");
}
}
作几点说明:
- cron 表达式是
@Scheduled的属性之一,其值可以直接设置为 cron 表达式; @Scheduled(cron="${cron.schedule}")是动态读取 application.properties 配置文件中的 cron 表达式。例如项目中的一个需求是每天凌晨0点执行,但是对于测试人员来说,不可能等到凌晨测试。动态读取可以帮助解决该问题。
任务二:
@Component
public class SecondTask {
/**
* 上一次执行完毕时间点之后多长时间再执行(ms)
*/
@Scheduled(fixedDelay = 2000)
public void run(){
System.out.println("这是创建的第二个定时任务");
}
}
任务三:
@Component
public class ThirdTask {
/**
* 与fixedDelay功能相同,上一次执行完毕时间点之后多长时间再执行(ms),区别是:1、时间是字符串;2、支持占位符
*/
// @Scheduled(fixedDelayString = "2000")
@Scheduled(fixedDelayString = "${time.fixedDelay}")
public void run(){
System.out.println("这是创建的第三个定时任务");
}
}
上面的三个任务列举了 @Scheduled 注解的三个参数。其实除此之外,查看 @Scheduled 的源码可知,还有其余的几个参数:
- fixedRate:上一次开始执行时间点之后多长时间再执行;
- fixedRateString:上一次开始执行时间点之后多长时间再执行;
- fixedRateString:与
fixedRate意思相同,只是使用字符串的形式。唯一不同的是支持占位符; - initialDelay:第一次延迟多长时间后再执行;
- initialDelayString:与 initialDelay 意思相同,只是使用字符串的形式。唯一不同的是支持占位符;
整合Quartz
如果以上的方式都无法满足项目的需求,则可以试试 Quartz 调度框架。它功能的强大以及使用无需多说了。此处我们看看 Quartz 在 SpringBoot 中的使用。
创建项目,引入 Quartz 调度框架启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-quartz</artifactId>
</dependency>
需要注意版本信息,如果 SpringBoot 版本是2.0以后的版本,直接引入 Quartz 启动器即可。但是如果是2.0以前的版本,需要引入以下 jar 包:
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
</dependency>
下面创建任务了:
public class QuartzTask extends QuartzJobBean {
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println(new Date());
}
}
任务需要继承 QuartzJobBean 抽象类,并重写 executeInternal 方法。
第三步,创建 quartz 配置类,添加 @Configuration 注解:
@Configuration
public class QuartzConfig {
@Bean
public JobDetail testQuartzTask() {
return JobBuilder.newJob(QuartzTask.class).withIdentity("quartztask").storeDurably().build();
}
@Bean
public Trigger testQuartzTrigger2() {
//cron方式,每隔5秒执行一次
return TriggerBuilder.newTrigger().forJob(testQuartzTask())
.withIdentity("quartztask")
.withSchedule(CronScheduleBuilder.cronSchedule("*/5 * * * * ?"))
.build();
}
}
上面的示例是使用 cron 表达式,当然也可以是固定时间间隔。本节是阐述 SpringBoot 和 Quartz 的整合,不作 Quartz 的详细使用。感兴趣的读者可以登录 Quartz 的官网 或者中文官网自行研究。
总结
定时任务的实现方式有很多种,除了上面说到的几种方式,还有利用线程池实现定时任务,有的系统是通过 Liunx 实现定时任务。总之,定时任务的实现方式多种多样,其方式要根据项目的实际情况而选。切不可为了实现而实现。

SpringBoot第十七篇:定时任务的更多相关文章
- SpringBoot(十七)-- 定时任务
日常开发中,经常会使用定时任务来执行跑批,springboot默认已经帮助我们整合了定时任务. 参考:https://blog.csdn.net/u013845177/article/details/ ...
- 跟我学SpringCloud | 第十七篇:服务网关Zuul基于Apollo动态路由
目录 SpringCloud系列教程 | 第十七篇:服务网关Zuul基于Apollo动态路由 Apollo概述 Apollo相比于Spring Cloud Config优势 工程实战 示例代码 Spr ...
- 解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译)
解剖SQLSERVER 第十七篇 使用 OrcaMDF Corruptor 故意损坏数据库(译) http://improve.dk/corrupting-databases-purpose-usin ...
- Python之路【第十七篇】:Django【进阶篇 】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django之【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- Python之路【第十七篇】:Django【进阶篇】
Python之路[第十七篇]:Django[进阶篇 ] Model 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接 ...
- SpringBoot第六篇:整合通用Mapper
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10876339.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 在以往的项 ...
- SpringBoot第七篇:整合Mybatis-Plus
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/10881666.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 一看这个名 ...
- Egret入门学习日记 --- 第十七篇(书中 7.4~8.2节 内容)
第十七篇(书中 7.4~8.2节 内容) 昨天看到 7.3 节,那么今天. 开始 7.4节. 好吧,这些其他的服务器运行知识,就不搞了... 至此,7.4节 内容结束. 开始 7.5节 内容. ...
随机推荐
- 转 让FPGA替代GPU的6大顾虑,你确定不看看吗?
最近FPGA又频频被各AI领域的巨头看好,比如微软.百度.科大讯飞都对FPGA应用前景有所期待.那么如果让你选择FPGA作为AI计算系统的主力军,你会有什么样的顾虑? 这几天,已经退役的AlphaGo ...
- 排序算法Java代码实现(二)—— 冒泡排序
本篇内容: 冒泡排序 冒泡排序 算法思想: 冒泡排序的原理是:从左到右,相邻元素进行比较. 每次比较一轮,就会找到序列中最大的一个或最小的一个.这个数就会从序列的最右边冒出来. 代码实现: /** * ...
- 邮箱图标的css样式
<div> <div style="position:relative; height:40px;width: 70px;border:2px solid black; m ...
- python计算不规则图形面积算法
介绍:大三上做一个医学影像识别的项目,医生在原图上用红笔标记病灶点,通过记录红色的坐标位置可以得到病灶点的外接矩形,但是后续会涉及到红圈内的面积在外接矩形下的占比问题,有些外接矩形内有多个红色标记,在 ...
- es6中find方法
find() 方法返回数组中满足提供的测试函数的第一个元素的值.否则返回 undefined. , , , , ]; var found = array1.find(function(element) ...
- elasticsearch ik分词
elasticsearch 默认并不支持中文分词,默认将每个中文字切分为一个词,这明显不符合我们的业务要求.这里就需要用到ik分词插件. 本文主要囊括了以下几部分,ik插件安装.ik用法介绍.自定义词 ...
- 新手入门必看:VectorDraw 常见问题整理大全(一)
VectorDraw Developer Framework(VDF)是一个用于应用程序可视化的图形引擎库.有了VDF提供的功能,您可以轻松地创建.编辑.管理.输出.输入和打印2D和3D图形文件.该库 ...
- tp5中使用原生sql查询总结【转】
注意事项: 1.先在database.php中配置好数据库 2.只要是数据库操作必须引用 use/think/Db;严格区分大小写. 下面是方法: public function hello5() { ...
- mycat原理及分表分库入门
1.什么是MyCat: MyCat是一个开源的分布式数据库系统,是一个实现了MySQL协议的服务器,前端用户可以把它看作是一个数据库代理,用MySQL客户端工具和命令行访问,而其后端可以用MySQL原 ...
- 百度云部署SSL证书
查找中间证书 为了确保兼容到所有浏览器,我们必须在阿里云上部署中间证书,如果不部署证书,虽然安装过程可以完全也不会报错,但可能导致Android系统,Chrome 和 Firefox等浏览器无法识别. ...