SpringBoot实现定时任务的三种方式小结
目录
- 定时任务实现的三种方式
- 使用Timer
- 使用ScheduledExecutorService
- 使用Spring Task
- 1.简单的定时任务
- 2.多线程执行
定时任务实现的三种方式
Timer
:这是java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务。使用这种方式可以让你的程序按照某一个频度执行,但不能在指定时间运行。一般用的较少。ScheduledExecutorService
:也jdk自带的一个类;是基于线程池设计的定时任务类,每个调度任务都会分配到线程池中的一个线程去执行,也就是说,任务是并发执行,互不影响。Spring Task
:Spring3.0以后自带的task,可以将它看成一个轻量级的Quartz,而且使用起来比Quartz简单许多。
使用Timer 这个目前在项目中用的较少,直接贴demo代码。具体的介绍可以查看api
public class TestTimer {public static void main(String[] args) {TimerTask timerTask = new TimerTask() {@Overridepublic void run() {System.out.println("taskrun:"+ new Date()); }}; Timer timer = new Timer(); //安排指定的任务在指定的时间开始进行重复的固定延迟执行。这里是每3秒执行一次timer.schedule(timerTask,10,3000); }}
使用ScheduledExecutorService 该方法跟Timer类似,直接看demo:
public class TestScheduledExecutorService {public static void main(String[] args) {ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor(); // 参数:1、任务体 2、首次执行的延时时间//3、任务执行间隔 4、间隔时间单位service.scheduleAtFixedRate(()->System.out.println("task ScheduledExecutorService "+new Date()), 0, 3, TimeUnit.SECONDS); }}
使用Spring Task
1.简单的定时任务
在SpringBoot项目中,我们可以很优雅的使用注解来实现定时任务,首先创建项目,导入依赖:
org.springframework.boot spring-boot-starter-weborg.springframework.boot spring-boot-starterorg.projectlombok lomboktrue org.springframework.boot spring-boot-starter-testtest
创建任务类:
@Slf4j@Componentpublic class ScheduledService {@Scheduled(cron = "0/5 * * * * *")public void scheduled(){log.info("=====>>>>>使用cron{}",System.currentTimeMillis()); }@Scheduled(fixedRate = 5000)public void scheduled1() {log.info("=====>>>>>使用fixedRate{}", System.currentTimeMillis()); }@Scheduled(fixedDelay = 5000)public void scheduled2() {log.info("=====>>>>>fixedDelay{}",System.currentTimeMillis()); }}
在主类上使用@EnableScheduling注解开启对定时任务的支持,然后启动项目
可以看到三个定时任务都已经执行,并且使同一个线程中串行执行,如果只有一个定时任务,这样做肯定没问题,当定时任务增多,如果一个任务卡死,会导致其他任务也无法执行。
2.多线程执行
在传统的Spring项目中,我们可以在xml配置文件添加task的配置,而在SpringBoot项目中一般使用config配置类的方式添加配置,所以新建一个AsyncConfig类
@Configuration@EnableAsyncpublic class AsyncConfig {/*此处成员变量应该使用@Value从配置中读取*/private int corePoolSize = 10; private int maxPoolSize = 200; private int queueCapacity = 10; @Beanpublic Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor(); executor.setCorePoolSize(corePoolSize); executor.setMaxPoolSize(maxPoolSize); executor.setQueueCapacity(queueCapacity); executor.initialize(); return executor; }}
@Configuration
:表明该类是一个配置类@EnableAsync
:开启异步事件的支持
在线cron表达式生成:http://qqe2.com/cron/index
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
推荐阅读
- 轻量级ORM框架Dapper应用之实现In操作
- 轻量级ORM框架Dapper应用之实现CURD操作
- 算法小结|基础算法——离散化
- 通过.NET|通过.NET 6实现RefreshToken
- 人工智能-Python实现岭回归
- 用R语言实现决策树分类
- 决策树|决策树,随机森林,集成学习的算法实现
- jq实现加减功能
- SpringBoot基于redis自定义注解实现后端接口防重复提交校验
- springboot中Excel文件下载踩坑大全