1. 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式:
  2.  
  3. 一、基于注解(@Scheduled)
  4. 二、基于接口(SchedulingConfigurer 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。
  5. 三、基于注解设定多线程定时任务

一、静态:基于注解

1、创建定时器

使用SpringBoot基于注解来创建定时任务非常简单,只需几行代码便可完成。 代码如下:

  1. @Component
  2. @Configuration //主要用于标记配置类,兼备component的效果
  3. @EnableScheduling //开启定时任务
  4. public class StaticScheduleTask {
  5.  
  6. @Resource
  7. RealTimeMonitorServiceImpl realTimeMonitorService;
  8.  
  9. //添加定时任务 4小时/4小时/4小时/
  10. @Scheduled(cron = "0 0 0/4 * * ?")
  11. private void configureTasks() {
  12. log.info("执行静态定时任务时间: " + LocalDateTime.now());
  13.  
  14. }
  15.  
  16. }

关于Cron表达式介绍

cronExpression定义时间规则,Cron表达式由6或7个空格分隔的时间字段组成:秒 分钟 小时 日期 月份 星期 年(可选)

  1. 字段  允许值  允许的特殊字符 
  2.        0-59     , - * / 
  3.        0-59     , - * / 
  4. 小时      0-23     , - * / 
  5. 日期      1-31     , - * ? / L W C 
  6. 月份      1-12     , - * / 
  7. 星期      1-7       , - * ? / L C
  8.      1970-2099   , - * /

表达式网站生成:   http://cron.qqe2.com/

二、动态:基于接口

基于接口(SchedulingConfigurer)

  1. <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter</artifactId>
  4. <version>2.0.4.RELEASE</version>
  5. </parent>
  6.  
  7. <dependencies>
  8. <dependency><!--添加Web依赖 -->
  9. <groupId>org.springframework.boot</groupId>
  10. <artifactId>spring-boot-starter-web</artifactId>
  11. </dependency>
  12. <dependency><!--添加MySql依赖 -->
  13. <groupId>mysql</groupId>
  14. <artifactId>mysql-connector-java</artifactId>
  15. </dependency>
  16. <dependency><!--添加Mybatis依赖 配置mybatis的一些初始化的东西-->
  17. <groupId>org.mybatis.spring.boot</groupId>
  18. <artifactId>mybatis-spring-boot-starter</artifactId>
  19. <version>1.3.1</version>
  20. </dependency>
  21. <dependency><!-- 添加mybatis依赖 -->
  22. <groupId>org.mybatis</groupId>
  23. <artifactId>mybatis</artifactId>
  24. <version>3.4.5</version>
  25. <scope>compile</scope>
  26. </dependency>
  27. </dependencies>

2、添加数据库记录:

开启本地数据库mysql,随便打开查询窗口,然后执行脚本内容,如下:

  1. DROP DATABASE IF EXISTS `socks`;
  2. CREATE DATABASE `socks`;
  3. USE `SOCKS`;
  4. DROP TABLE IF EXISTS `cron`;
  5. CREATE TABLE `cron` (
  6. `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  7. `cron` varchar(30) NOT NULL
  8. );
  9. INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');

然后在项目中的application.yml 添加数据源:

  1. spring:
  2. datasource:
  3. url: jdbc:mysql://localhost:3306/socks
  4. username: root
  5. password: 123456

3、创建定时器

数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。
具体代码如下:

  1. @Component
  2. @Configuration //1.主要用于标记配置类,兼备Component的效果。
  3. @EnableScheduling // 2.开启定时任务
  4. public class DynamicScheduleTask implements SchedulingConfigurer {
  5.  
  6. @Mapper
  7. public interface CronMapper {
  8. @Select("select cron from cron limit 1")
  9. public String getCron();
  10. }
  11.  
  12. @Autowired //注入mapper
  13. @SuppressWarnings("all")
  14. CronMapper cronMapper;
  15.  
  16. /**
  17. * 执行定时任务.
  18. */
  19. @Override
  20. public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
  21.  
  22. taskRegistrar.addTriggerTask(
  23. //1.添加任务内容(Runnable)
  24. () -> System.out.println("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
  25. //2.设置执行周期(Trigger)
  26. triggerContext -> {
  27. //2.1 从数据库获取执行周期
  28. String cron = cronMapper.getCron();
  29. //2.2 合法性校验.
  30. if (StringUtils.isEmpty(cron)) {
  31. // Omitted Code ..
  32. }
  33. //2.3 返回执行周期(Date)
  34. return new CronTrigger(cron).nextExecutionTime(triggerContext);
  35. }
  36. );
  37. }
  38.  
  39. }

三、多线程定时任务

基于注解设定多线程定时任务

1、创建多线程定时任务

  1. //@Component注解用于对那些比较中立的类进行注释;
  2. //相对与在持久层、业务层和控制层分别采用 @Repository、@Service 和 @Controller 对分层中的类进行注释
  3. @Component
  4. @EnableScheduling // 1.开启定时任务
  5. @EnableAsync // 2.开启多线程
  6. public class MultithreadScheduleTask {
  7.  
  8. @Async
  9. @Scheduled(fixedDelay = 1000) //间隔1秒
  10. public void first() throws InterruptedException {
  11. System.out.println("第一个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
  12. System.out.println();
  13. Thread.sleep(1000 * 10);
  14. }
  15.  
  16. @Async
  17. @Scheduled(fixedDelay = 2000)
  18. public void second() {
  19. System.out.println("第二个定时任务开始 : " + LocalDateTime.now().toLocalTime() + "\r\n线程 : " + Thread.currentThread().getName());
  20. System.out.println();
  21. }
  22. }

代码地址:https://github.com/mmzsblog/springboot-schedule

转载:https://www.cnblogs.com/mmzs/p/10161936.html

springboot项目 @Scheduled注解 实现定时任务的更多相关文章

  1. springboot 基于@Scheduled注解 实现定时任务

    前言 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 一.基于注解(@Scheduled) 二.基于接口(SchedulingConfigurer) 前者相信大家都很熟悉, ...

  2. Spring 的@Scheduled注解实现定时任务运行和调度

    Spring 的@Scheduled注解实现定时任务运行和调度 首先要配置我们的spring.xml   ---  即spring的主配置文件(有的项目中叫做applicationContext.xm ...

  3. Spring Boot 使用 @Scheduled 注解创建定时任务

    在项目开发中我们经常需要一些定时任务来处理一些特殊的任务,比如定时检查订单的状态.定时同步数据等等. 在 Spring Boot 中使用 @Scheduled 注解创建定时任务非常简单,只需要两步操作 ...

  4. Spring Boot入门(三):使用Scheduled注解实现定时任务

    在程序开发的过程中,经常会使用定时任务来实现一些功能,比如: 系统依赖于外部系统的非核心数据,可以定时同步 系统内部一些非核心数据的统计计算,可以定时计算 系统内部的一些接口,需要间隔几分钟或者几秒执 ...

  5. 使用轻量级Spring @Scheduled注解执行定时任务

    WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了 ...

  6. 基于 @Scheduled 注解的 ----定时任务

    最常用的方法@Scheduled 注解表示起开定时任务 依赖 <dependencies> <dependency> <groupId>org.springfram ...

  7. 使用spring提供的@Scheduled注解创建定时任务

    使用方法 操作非常简单,只要按如下几个步骤配置即可 1. 导入jar包或添加依赖,其实定时任务只需要spring-context即可,当然起服务还需要spring-web: 2. 编写定时任务类和方法 ...

  8. spring @Scheduled注解执行定时任务

    以前框架使用quartz框架执行定时调度问题. 这配置太麻烦.每个调度都需要多加在spring的配置中. 能不能减少配置的量从而提高开发效率. 最近看了看spring的 scheduled的使用注解的 ...

  9. quartz 框架定时任务,使用spring @Scheduled注解执行定时任务

    配置quartz 在spring中需要三个jar包: quartz-1.6.5.jar.commons-collections-3.2.jar.commons-logging-1.1.jar 首先要配 ...

随机推荐

  1. 【转载】ASP.NET 内联代码、内联表达式、数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号)

    ASP.NET 内联代码.内联表达式.数据绑定表达式使用方法罗列(形式就是常说的尖括号 百分号 等于号 井号) 今天在做渭南电脑维修网的一个小功能时遇到了一些问题,因此特别列出,以备他日之用. 首先对 ...

  2. 515. Find Largest Value in Each Tree Row

    You need to find the largest value in each row of a binary tree. Example: Input: 1 / \ 3 2 / \ \ 5 3 ...

  3. gin中XML/JSON/YAML/ProtoBuf 渲染

    package main import ( "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/testdata/p ...

  4. 集合框架-Map集合重点方法keySet演示

    1 package cn.itcast.p6.map.demo; 2 3 import java.util.HashMap; 4 import java.util.Iterator; 5 import ...

  5. 科技爱好者周刊(第 176 期):中国法院承认 GPL 吗?

    这里记录每周值得分享的科技内容,周五发布. 本杂志开源(GitHub: ruanyf/weekly),欢迎提交 issue,投稿或推荐科技内容. 周刊讨论区的帖子<谁在招人?>,提供大量程 ...

  6. 通过kubeadm工具部署k8s集群

    1.概述 kubeadm是一工具箱,通过kubeadm工具,可以快速的创建一个最小的.可用的,并且符合最佳实践的k8s集群. 本文档介绍如何通过kubeadm工具快速部署一个k8s集群. 2.主机规划 ...

  7. [源码解析] 分布式训练Megatron (1) --- 论文 & 基础

    [源码解析] 分布式训练Megatron (1) --- 论文 & 基础 目录 [源码解析] 分布式训练Megatron (1) --- 论文 & 基础 0x00 摘要 0x01 In ...

  8. 分享一个基于 ABP(.NET 5.0) + vue-element-admin 管理后台

    1.前言 分享一个基于ABP(.NET 5.0) + vue-element-admin项目.希望可以降低新手对于ABP框架的学习成本,感兴趣的同学可以下载项目启动运行一下.对于想选型采用ABP框架的 ...

  9. 布客·ApacheCN 翻译校对活动进度公告 2020.5

    注意 请贡献者查看参与方式,然后直接在 ISSUE 中认领. 翻译/校对三个文档就可以申请当负责人,我们会把你拉进合伙人群.翻译/校对五个文档的贡献者,可以申请实习证明. 请私聊片刻(52981514 ...

  10. 「CTSC2006」歌唱王国

    概率生成函数\(g(x)=\sum_{i\geq 0}t_ix^i\),\(t_i\)表示结果为\(i\)的概率 令\(f(x)\)表示i位表示串结束时长度为i的概率,\(G(x)\)表示i位表示串长 ...