文章目录
- 一、什么是定时任务
- 二、代码示例
- 1、 @Scheduled 定时任务
- 2、多线程定时任务
- 3、基于接口(SchedulingConfigurer)实现动态更改定时任务
- 3.1 数据库中存储cron信息
- 3.2 pom.xml文件中增加mysql依赖
- 3.3 application.yaml文件中增加mysql数据库配置:
- 3.4 创建定时器
- 3.5 启动测试
一、什么是定时任务
在项目开发过程中,经常会使用到定时任务。顾名思义,定时任务一般指定时执行的方法。例如,每天凌晨0点同步 A 系统的数据到 B 系统;每2小时统计用户的积分情况;每周一给支付宝用户推送上周收入支出数据报表等等。
一般情况下,很多业务会定时在凌晨进行处理。因为这能避开用户使用高峰期,空闲时服务器资源充足,而且对用户影响小。
通过 Spring Boot 框架,我们可以使用3种方式来实现定时任务。
- 第1种是基于注解的方式,比较常用,但是这种在程序运行过程种不能动态更改定时任务的时间。
- 第2种是可以动态更改定时任务的时间。
- 第3种是可以动态更改定时任务的时间,还可以动态启动,停止定时任务。
二、代码示例
1、 @Scheduled 定时任务
使用 Spring Boot 内置的注解方式,即在需要定时执行的方法上添加@Scheduled注解即可。定时执行的方法不能有参数,并且一般没有返回值,即使有返回值也没什么用。注意定时任务所在的类要作为 Spring Bean,在类上添加@Component注解即可。
package com.chenpi.springschedule.task;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;/*** @author * @version 1.0* @description 定时任务类* @date 2024-11-05*/
@Component
public class ScheduledTask {private static final Logger LOGGER = LoggerFactory.getLogger(ScheduledTask.class);// 每5秒执行一次@Scheduled(cron = "0/5 * * * * ? ")public void test() {LOGGER.info(">>>>> ScheduledTask doing ...");}
}
然后在启动类上添加@EnableScheduling注解开启定时任务。默认情况下,系统会自动启动一个线程,调度执行项目中定义的所有定时任务。
package com.chenpi.springschedule;import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;@SpringBootApplication
@EnableScheduling
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}
启动项目,即可在控制台中每5秒看到定时任务被执行
2024-11-05 20:46:55.011 INFO 11800 --- [ scheduling-1] c.c.springschedule.task.ScheduledTask : >>>>> ScheduledTask doing ...
2024-11-05 20:47:00.014 INFO 11800 --- [ scheduling-1] c.c.springschedule.task.ScheduledTask : >>>>> ScheduledTask doing ...
2024-11-05