一篇文章搞定,SpringBoot 创建定时任务
作者:yizhiwazi
链接:https://www.jianshu.com/p/d160f2536de7
序言:创建定时任务非常简单,主要有两种创建方式:
一、基于注解(@Scheduled)
二、基于接口(SchedulingConfigurer). 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就大派用场了。
一、静态定时任务(基于注解)
基于注解来创建定时任务非常简单,只需几行代码便可完成。
@Scheduled 除了支持灵活的参数表达式cron之外,还支持简单的延时操作,例如 fixedDelay ,fixedRate 填写相应的毫秒数即可。
@Configuration //1.主要用于标记配置类,兼备Component的效果。
@EnableScheduling // 2.开启定时任务
public class SimpleScheduleConfig {//3.添加定时任务@Scheduled(cron = "0/5 * * * * ?")private void configureTasks() {System.err.println("执行定时任务1: " + LocalDateTime.now());}
}
Cron表达式参数分别表示:
秒(0~59) 例如0/5表示每5秒
分(0~59)
时(0~23)
月的某天(0~31) 需计算
月(0~11)
周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
启动应用,可以看到控制台的信息如下:
诚然,使用Scheduled 确实很方便,但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,这多少有些不方便。为了达到实时生效的效果,可以使用接口来完成定时任务。
二、动态定时任务(基于接口)
为了演示效果,这里选用 Mysql数据库 和 Mybatis 来查询和调整定时任务的执行周期,然后观察定时任务的执行情况。
1.引入依赖
<!--依赖管理 --><dependencies><dependency><!--添加Web依赖 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><!--添加Mybatis依赖 --><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.1</version></dependency><dependency><!--添加MySql依赖 --><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><scope>runtime</scope></dependency><dependency><!--添加Test依赖 --><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies>
2.添加数据库记录
在Navicat 连接本地数据库,随便打开查询窗口,然后执行脚本内容,如下:
DROP DATABASE IF EXISTS `socks`;
CREATE DATABASE `socks`;
USE `SOCKS`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron` (`cron_id` varchar(30),`cron` varchar(30)
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');
然后在项目中的application.yml 添加数据源:
#application.yml 配置如下:
spring:datasource:url: jdbc:mysql://localhost:3306/socks?useSSL=falseusername: rootpassword: root
3.创建定时器
数据库准备好数据之后,我们编写定时任务,注意这里添加的是TriggerTask,目的是循环读取我们在数据库设置好的执行周期,以及执行相关定时任务的内容。具体代码如下:
@Configuration
@EnableScheduling
public class CompleteScheduleConfig implements SchedulingConfigurer {@Mapperpublic interface CronMapper {@Select("select cron from cron limit 1")String getCron();}@Autowired@SuppressWarnings("all")CronMapper cronMapper;/*** 执行定时任务.*/@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(//1.添加任务内容(Runnable)() -> System.out.println("执行定时任务2: " + LocalDateTime.now().toLocalTime()),//2.设置执行周期(Trigger)triggerContext -> {//2.1 从数据库获取执行周期String cron = cronMapper.getCron();//2.2 合法性校验.if (StringUtils.isEmpty(cron)) {// Omitted Code ..}//2.3 返回执行周期(Date)return new CronTrigger(cron).nextExecutionTime(triggerContext);});}}
4. 动态修改执行周期
启动应用后,查看控制台,打印时间是我们预期的每5秒一次:
然后打开Navicat ,将执行周期修改为每1秒执行一次,如图:
查看控制台,发现执行周期已经改变,并且不需要我们重启应用,十分方便。如图:
添加我私人微信
置顶或星标公众号,第一时间接收小海热文
方法如下
一篇文章搞定,SpringBoot 创建定时任务相关推荐
- Android NDK开发之旅(2):一篇文章搞定Android Studio中使用CMake进行NDK/JNI开发
Android NDK开发之旅(2):一篇文章搞定android Studio中使用CMake进行NDK/JNI开发 (码字不易,转载请声明出处:http://blog.csdn.NET/andrex ...
- 一篇文章搞定GVIM(根据工作经验持续更新)
文章目录 0.引言 1.在Linux下面安装VIM 2.基本操作 2.1三种模式 2.1 保存退出:wq没反应?! 2.2 解决鼠标不能用的问题 2.3 VIM上下左右移动hjkl 2.4 跳转到第n ...
- 一篇文章搞定DX9.0c 环境里的3DXSpriet !!
四年前写过一篇<一篇文章搞定3DXSpriet !! >得到了很多的反馈,现在那篇文章中的好多代码已经不可以再用了,所以对其中的一些代码做了改动,为了方便初学者掌握3DXSpriet,再写 ...
- 一篇文章搞定《RecyclerView缓存复用机制》
一篇文章搞定<RecyclerView缓存复用机制> 前言 零.为什么要缓存 一.RecyclerView如何构建我们的列表视图 二.缓存过程 三.缓存结构 1.mChangedScrap ...
- 超硬核!!!一篇文章搞定TCP、UDP、Socket、HTTP(详细网络编程内容+现实解释三次握手四次挥手+代码示例)【网络编程 1】
TCP.UDP.Socket 一天面试的经验: 什么是网络编程 网络编程中两个主要的问题 网络协议是什么 为什么要对网络协议分层 计算机网络体系结构 1 TCP / UDP 1.1 什么是TCP/IP ...
- 一篇文章搞定《Android布局优化》
------<一篇文章搞定Android布局优化> 前言 为什么要进行布局优化? Android绘制原理 双缓冲机制 布局加载原理 布局加载优化的一些方法介绍 AsyncLayoutInf ...
- 一篇文章搞定百度OCR图片文字识别API
一篇文章搞定百度OCR图片文字识别API https://www.jianshu.com/p/7905d3b12104 转载于:https://www.cnblogs.com/chongdongxia ...
- python基础知识-一篇文章搞定Python全部基础知识
原标题:一篇文章搞定Python全部基础知识 前言: 1.Python软件安装 第一章.字符串及数字变量 1.变量 要点提炼:Python变量为强类型动态类型.换言之,变量很任性,你给他int,他就是 ...
- 一篇文章搞定java中的垃圾回收机制面试题
一篇文章搞定java中的垃圾回收机制面试题 任何语言在运行过程中都会创建对象,也就意味着需要在内存中为这些对象在内存中分配空间,在这些对象失去使用的意义的时候,需要释放掉这些内容,保证内存能够提供给新 ...
最新文章
- 通过eclipse调试MapReduce任务
- php写账户冻结_线上开户指南(首次入金2万,账户总净资产不得低于1万,交易佣金万三,最低25,合单,没平台费)入金后才会有账户号...
- .NET Core 1.1 Preview 1上线:支持macOS 10.12/Linux Mint 18
- 用GDAL/OGR去读shapefile
- Linux简单命令集——less
- vantUI 弹出层(轻提示)案例 - 踩坑篇
- 方程组的直接解法和迭代法 python_最小二乘法及python 实现
- beginnersbook C++ 教程·翻译完成 | ApacheCN
- java duplicate parameter e_传递参数[duplicate]时出现问题
- alexnet- tensorflow
- c语言宏代码大全,C语言宏
- WINDOWS XP优化批处理
- 餐饮业实施5S管理的效益及实施方案
- 更改putty默认配色方案
- openstack学习笔记六 多节点部署之keystone
- 如何将 Django 服务器单独部署到 heroku 上
- 太阳能电池基本特性实验报告_太阳能电池基本特性测定实验
- 关于空字符(NUL)在三种不同语言中的匹配
- 02 Spring标签解析-BeanDefinitionParser
- VB6实现动态增加和删除控件数组中的控件2021-06-02