Spring boot定时任务(Scheduling Tasks)
定时任务(Scheduling Tasks)
这篇文章将介绍怎么通过spring去做调度任务。
简介
定时任务或者说定时调度,是系统中比较普遍的一个功能,例如数据归档、清理,数据定时同步(非实时),定时收发,流量控制等等都需要用到定时任务,常见的定时调度框架有Quartz、TBSchedule等。
同样,Spring自3.0版本起也增加了任务调度功能Schedule,它好比是一个轻量级的Quartz,使用起来方便、简洁,且不需要依赖其他的JAR包。之所以说它是轻量级Quartz,是因为在现如今遍地分布式的大环境下,Spring自带的Schedule不支持分布式部署,所以若是分布式环境开发请忽略此文章,可以选用Quartz、TBSchedule等,且一般稍大点的公司都有独立的统一调度中心。
正文
- @EnableScheduling,开启调度任务。
@SpringBootApplication
@EnableScheduling
public class SchedulingApplication {public static void main(String[] args) {SpringApplication.run(SchedulingApplication.class, args);}
}
创建定时任务
创建一个定时任务,每过5s在控制台打印当前时间。
/** 定时任务 */
@Component
public class ScheduledTasks {private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");@Scheduled(fixedRate = 5000)public void reportCurrentTime() {log.info("The time is now {}", dateFormat.format(new Date()));}
}
通过在方法上加@Scheduled注解,表明该方法是一个调度任务。
- @Scheduled(fixedRate = 5000) :上一次开始执行时间点之后5秒再执行
- @Scheduled(fixedDelay = 5000) :上一次执行完毕时间点之后5秒再执行
- @Scheduled(initialDelay=1000, fixedRate=5000) :第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
- @Scheduled(cron=" /5 ") :通过cron表达式定义规则,什么是cro表达式,自行搜索引擎。
测试
启动springboot工程,控制台没过5s就打印出了当前的时间。
2019-09-23 10:18:10.170 INFO 4768 --- [ scheduling-1] c.a.scheduling.task.ScheduledTasks : The time is now 10:18:10
2019-09-23 10:18:15.170 INFO 4768 --- [ scheduling-1] c.a.scheduling.task.ScheduledTasks : The time is now 10:18:15
2019-09-23 10:18:20.169 INFO 4768 --- [ scheduling-1] c.a.scheduling.task.ScheduledTasks : The time is now 10:18:20
2019-09-23 10:18:25.170 INFO 4768 --- [ scheduling-1] c.a.scheduling.task.ScheduledTasks : The time is now 10:18:25
2019-09-23 10:18:30.170 INFO 4768 --- [ scheduling-1] c.a.scheduling.task.ScheduledTasks : The time is now 10:18:30
2019-09-23 10:18:35.170 INFO 4768 --- [ scheduling-1] c.a.scheduling.task.ScheduledTasks : The time is now 10:18:35
总结
在springboot创建定时任务比较简单,只需2步:
- 1.在程序的入口加上@EnableScheduling注解。
- 2.在定时方法上加@Scheduled注解。
源码下载:
https://github.com/AndyYoungCN/springbootexample/tree/master/source/schedulingtask
动态配置定时任务
Spring提供了SchedulingConfigurer接口,下面介绍可配置、动态修改触发器的定时任务
可配置的定时任务组件需要实现SchedulingConfigurer接口中的configureTasks方法,该方法有两个入参(Runnable task, Trigger trigger),第一个为我们任务的具体逻辑实现,第二个为触发器,动态的定时任务则意味着Trigger需要动态获取,由于之前我们已经集成redis,因此这里我们从redis获取相关配置。
/** 动态配置定时 */
@Component
public class DynamicTask implements SchedulingConfigurer {private static Logger log = LoggerFactory.getLogger(DynamicTask.class);@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(doTask(), getTrigger());}private Runnable doTask() {return new Runnable() {@Overridepublic void run() {// 业务逻辑log.info("执行了MyDynamicTask,时间为:" + new Date(System.currentTimeMillis()));}};}private Trigger getTrigger() {return new Trigger() {@Overridepublic Date nextExecutionTime(TriggerContext triggerContext) {// 触发器CronTrigger trigger = new CronTrigger(getCron());return trigger.nextExecutionTime(triggerContext);}};}public String getCron() {// 可以在这边修改定时器。查找配置,返回需要的配置return "2 */10 22 1-10 * *";}
}
上述cron也可以从其他地方动态获取,这样在配置值修改后,定时任务调度器便被更新了,不过需要注意的是,此种方式修改了配置值后,需要在下一次调度结束后,才会更新调度器,并不会在修改配置值时实时更新,实时更新需要在修改配置值时额外增加相关逻辑处理。
Spring boot定时任务(Scheduling Tasks)相关推荐
- Spring Boot定时任务应用实践
在Spring Boot中实现定时任务功能,可以通过Spring自带的定时任务调度,也可以通过集成经典开源组件Quartz实现任务调度. 一.Spring定时器 1.cron表达式方式 使用自带的定时 ...
- 14. Spring Boot定时任务的使用【从零开始学Spring Boot】
[视频 & 交流平台] à SpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008& ...
- @scheduled注解配置时间_Java开发重写Spring Boot定时任务,支持可动态调整执行时间...
Spring Boot应该是目前最火的java开源框架了,它简化了我们创建一个web服务的过程,让我们可以在很短时间.基本零配置就可以启动一个web服务. 定时任务在我们平常的业务开发用的非常多,Sp ...
- Spring Boot定时任务-Job类对象注入
如何在我们的任务类当中,去完成其他对象的注入,Job类中注入对象,回到我们的代码当中,这个是我们编写的Job类,比如我们在Job类当中呢,我要使用到我业务下某个类的某个方法,那我们是不是要将我们业务层 ...
- Spring Boot定时任务-SpringBoot整合Quartz
如何通过SpringBoot整合Quartz框架,我们首先去创建一个项目,接下来我们需要在pom文件里添加坐标,我们在使用SpringBoot整合Quartz的时候,需要添加哪些坐标呢,我们来看一下, ...
- Spring Boot 定时任务
2019独角兽企业重金招聘Python工程师标准>>> 本文主要介绍了Spring Boot中使用@Scheduled创建定时任务.我们在编写Spring Boot应用中经常会遇到这 ...
- spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现
spring 定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现 依赖包 如下 <dependencies><dependen ...
- Spring Boot定时任务-@Scheduled的使用
SpringBoot对于定时任务的支持,其实我们在开发过程当中,定时任务的技术使用,还是比较多的,比如说我系统当中,要求在一个特定的时间,给用户发送一些信息,或者我的系统要求在一个特定的时间,对于Re ...
- Spring Boot定时任务-Quartz介绍
SpringBoot如何整合第三方定时任务框架,SpringBoot整合Quartz定时任务框架,我们主要来了解一下Quartz的一个介绍,以及对于Quartz使用的一个基本思路,我们先来看Quart ...
最新文章
- 嵌入式开发有年龄限制吗_2021年考监理工程师有年龄限制吗?女生可以考监理工程师吗?...
- ios .a文件支持结构合并arm64 armv7 i386 x86_64
- java task多线程_JAVA语言-多线程实现的四种方式
- EL之GB(GBR):利用GBR对回归问题(实数值评分预测)建模
- 商品订单表怎么设计_三级分销系统系统设计
- (25)FPGA面试题5分频器
- UVA13017 LA7274 Canvas Painting【哈夫曼编码】
- 在VS2015中使用SDL2.0
- [转]centos7.2 下 nginx 开机启动
- BAT中如何使用for循环
- 表面缺陷检测:机器视觉检测技术
- 中望3d快捷键命令大全_室内设计3D快捷键 CAD命令
- java怎么才能学透彻?
- Scrum Or Kanban: 选择属于自己的敏捷管理框架
- 信息学奥赛一本通-1055:判断闰年
- PHP 全局变量 - 超全局变量
- Vuetify学习记录(三)-- v-data-table
- 使用Java实现Comet风格的Web应用(二)
- 大型网站技术架构一览
- mysql存储过程给多个变量赋值_MySQL存储过程如何进行变量的定义和赋值
热门文章
- 如何快速评估16S rRNA基因引物的覆盖率及特异性
- R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(不同分组配置不同的箱体填充色+灰度尺度图)实战
- R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签A、B、设置组合图像使用共享的图例(shared legend in cowplot)
- R语言进行主成分分析(PCA)、使用prcomp函数进行主成分分析:碎石图可视化(scree plot)、R通过线图(line plot)来可视化主成分分析的碎石图(scree plot)
- R可视化绘制卡方分布图(Chi-Square Distribution)
- R聚类(整群)抽样(Cluster Sampling)
- 数据库事务的ACID特性及含义
- 精益数据分析(学习笔记)——长期更新
- RNA-Seq专题课程大纲
- 测序数据的处理方法及装置制造方法及图纸