spring boot 开启定时任务的三种方式

序言
使用创建定时任务非常简单 , 目前主要有以下三种创建方式:
回到顶部
一、静态:基于注解
基于注解@默认为单线程 , 开启多个任务时 , 任务的执行时机会受上一个任务执行时间的影响 。
1、创建定时器
使用基于注解来创建定时任务非常简单 , 只需几行代码便可完成 。代码如下:
@Component@Configuration//1.主要用于标记配置类 , 兼备Component的效果 。@EnableScheduling// 2.开启定时任务public class SaticScheduleTask {//3.添加定时任务@Scheduled(cron = "0/5 * * * * ?")//或直接指定时间间隔 , 例如:5秒//@Scheduled(fixedRate=5000)private void configureTasks() {System.err.println("执行静态定时任务时间: " + LocalDateTime.now());}}
Cron表达式参数分别表示:
@:除了支持灵活的参数表达式cron之外 , 还支持简单的延时操作 , 例如 ,  填写相应的毫秒数即可 。
2、启动测试
启动应用 , 可以看到控制台打印出如下信息:
显然 , 使用@ 注解很方便 , 但缺点是当我们调整了执行周期的时候 , 需要重启应用才能生效 , 这多少有些不方便 。为了达到实时生效的效果 , 可以使用接口来完成定时任务 。
回到顶部
二、动态:基于接口
基于接口()
1、导入依赖包:
org.springframework.bootspring-boot-starter2.0.4.RELEASEorg.springframework.bootspring-boot-starter-webmysqlmysql-connector-javaorg.mybatis.spring.bootmybatis-spring-boot-starter1.3.1org.mybatismybatis3.4.5compile
2、添加数据库记录:
开启本地数据库mysql , 随便打开查询窗口 , 然后执行脚本内容 , 如下:
DROP DATABASE IF EXISTS `socks`;CREATE DATABASE `socks`;USE `SOCKS`;DROP TABLE IF EXISTS `cron`;CREATE TABLE `cron`(`cron_id` varchar(30) NOT NULL PRIMARY KEY,`cron` varchar(30) NOT NULL);INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');
然后在项目中的.yml 添加数据源:
spring:datasource:url: jdbc:mysql://localhost:3306/socksusername: rootpassword: 123456
3、创建定时器
数据库准备好数据之后 , 我们编写定时任务 , 注意这里添加的是 , 目的是循环读取我们在数据库设置好的执行周期 , 以及执行相关定时任务的内容 。
具体代码如下:
@Component@Configuration//1.主要用于标记配置类 , 兼备Component的效果 。@EnableScheduling// 2.开启定时任务public class DynamicScheduleTask implements SchedulingConfigurer {@Mapperpublic interface CronMapper {@Select("select cron from cron limit 1")public String getCron();}@Autowired//注入mapper@SuppressWarnings("all")CronMapper cronMapper;/*** 执行定时任务.*/@Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.addTriggerTask(//1.添加任务内容(Runnable)() -> System.out.println("执行动态定时任务: " + 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、启动测试
启动应用后 , 查看控制台 , 打印时间是我们预期的每10秒一次: