定时任务(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)相关推荐

  1. Spring Boot定时任务应用实践

    在Spring Boot中实现定时任务功能,可以通过Spring自带的定时任务调度,也可以通过集成经典开源组件Quartz实现任务调度. 一.Spring定时器 1.cron表达式方式 使用自带的定时 ...

  2. 14. Spring Boot定时任务的使用【从零开始学Spring Boot】

    [视频 & 交流平台] à SpringBoot视频 http://study.163.com/course/introduction.htm?courseId=1004329008& ...

  3. @scheduled注解配置时间_Java开发重写Spring Boot定时任务,支持可动态调整执行时间...

    Spring Boot应该是目前最火的java开源框架了,它简化了我们创建一个web服务的过程,让我们可以在很短时间.基本零配置就可以启动一个web服务. 定时任务在我们平常的业务开发用的非常多,Sp ...

  4. Spring Boot定时任务-Job类对象注入

    如何在我们的任务类当中,去完成其他对象的注入,Job类中注入对象,回到我们的代码当中,这个是我们编写的Job类,比如我们在Job类当中呢,我要使用到我业务下某个类的某个方法,那我们是不是要将我们业务层 ...

  5. Spring Boot定时任务-SpringBoot整合Quartz

    如何通过SpringBoot整合Quartz框架,我们首先去创建一个项目,接下来我们需要在pom文件里添加坐标,我们在使用SpringBoot整合Quartz的时候,需要添加哪些坐标呢,我们来看一下, ...

  6. Spring Boot 定时任务

    2019独角兽企业重金招聘Python工程师标准>>> 本文主要介绍了Spring Boot中使用@Scheduled创建定时任务.我们在编写Spring Boot应用中经常会遇到这 ...

  7. spring -boot定时任务 quartz 基于 MethodInvokingJobDetailFactoryBean 实现

    spring 定时任务 quartz 基于  MethodInvokingJobDetailFactoryBean 实现 依赖包 如下 <dependencies><dependen ...

  8. Spring Boot定时任务-@Scheduled的使用

    SpringBoot对于定时任务的支持,其实我们在开发过程当中,定时任务的技术使用,还是比较多的,比如说我系统当中,要求在一个特定的时间,给用户发送一些信息,或者我的系统要求在一个特定的时间,对于Re ...

  9. Spring Boot定时任务-Quartz介绍

    SpringBoot如何整合第三方定时任务框架,SpringBoot整合Quartz定时任务框架,我们主要来了解一下Quartz的一个介绍,以及对于Quartz使用的一个基本思路,我们先来看Quart ...

最新文章

  1. 嵌入式开发有年龄限制吗_2021年考监理工程师有年龄限制吗?女生可以考监理工程师吗?...
  2. ios .a文件支持结构合并arm64 armv7 i386 x86_64
  3. java task多线程_JAVA语言-多线程实现的四种方式
  4. EL之GB(GBR):利用GBR对回归问题(实数值评分预测)建模
  5. 商品订单表怎么设计_三级分销系统系统设计
  6. (25)FPGA面试题5分频器
  7. UVA13017 LA7274 Canvas Painting【哈夫曼编码】
  8. 在VS2015中使用SDL2.0
  9. [转]centos7.2 下 nginx 开机启动
  10. BAT中如何使用for循环
  11. 表面缺陷检测:机器视觉检测技术
  12. 中望3d快捷键命令大全_室内设计3D快捷键 CAD命令
  13. java怎么才能学透彻?
  14. Scrum Or Kanban: 选择属于自己的敏捷管理框架
  15. 信息学奥赛一本通-1055:判断闰年
  16. PHP 全局变量 - 超全局变量
  17. Vuetify学习记录(三)-- v-data-table
  18. 使用Java实现Comet风格的Web应用(二)
  19. 大型网站技术架构一览
  20. mysql存储过程给多个变量赋值_MySQL存储过程如何进行变量的定义和赋值

热门文章

  1. 如何快速评估16S rRNA基因引物的覆盖率及特异性
  2. R语言使用ggplot2包使用geom_boxplot函数绘制基础分组箱图(不同分组配置不同的箱体填充色+灰度尺度图)实战
  3. R语言使用cowplot包的plot_grid函数将两个ggplot2可视化结果并排组合起来并添加图像标签A、B、设置组合图像使用共享的图例(shared legend in cowplot)
  4. R语言进行主成分分析(PCA)、使用prcomp函数进行主成分分析:碎石图可视化(scree plot)、R通过线图(line plot)来可视化主成分分析的碎石图(scree plot)
  5. R可视化绘制卡方分布图(Chi-Square Distribution)
  6. R聚类(整群)抽样(Cluster Sampling)
  7. 数据库事务的ACID特性及含义
  8. 精益数据分析(学习笔记)——长期更新
  9. RNA-Seq专题课程大纲
  10. 测序数据的处理方法及装置制造方法及图纸