Spring Boot非分布式任务调度解决方案实战
在项目开发过程中,经常需要定时任务来做一些内容,比如定时进行数据统计(阅读量统计),数据更新(生成每天的歌单推荐)、爬虫程序定时启动爬取数据等。这些定时任务就是说的大气一点就是“任务调度”,需要用到任务调度框架。任务调度框架可以分为分布式任务调度框架和非分布式任务调度框架。
Spring Boot已经内置实现了一种非分布式的任务调度框架Scheduled,我们只需要添加相应的注解就可以完成定时任务的配置。下面分两步来配置一个定时任务,并实现用多线程和异步方式来进行任务调度:
- 创建定时任务
- 启动类添加注解
- 多线程的支持
- 异步的支持
创建定时任务
这里需要用到Cron表达式,如果对Cron表达式不是很熟悉,可以查看cron表达式详解。
自定义的一个定时任务:每10s中执行一次打印任务,并添加 @Scheduled 注解。
@Component public class TimerTask { private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Scheduled(cron = "*/10 * * * * ?") // 每10s执行一次,秒-分-时-天-月-周-年 public void test() throws Exception { System.out.println(simpleDateFormat.format(new Date()) + "定时任务执行咯"); } }
启动类添加注解
在启动类上面添加@EnableScheduling注解,开启Spring Boot对定时任务的支持。为什么在启动类添加注解呢?在启动类添加注解,表明定时任务的生效范围是整个项目的,项目启动即生效。
@SpringBootApplication @EnableScheduling public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } }
执行效果:
多线程支持
通过上述方式的任务调度是单线程执行的,也就是说,如果有多个调度任务,他们之间会有影响的。如果想要多线程执行任务,Spring Boot也是支持的:
@Bean public TaskScheduler taskScheduler(){ ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(10); return threadPoolTaskScheduler; }
异步支持
启动类添加 @EnableAsync 注解,执行方法添加 @Async 注解。
@Async public void doProcess() throws InterruptedException { Thread.sleep(3000); }
在大数据和人工智能的时代,分布式的系统随处可见,关于分布式的任务调度框架也可以查看我的相关文章XXL-JOB等。
由于博主也是在攀登的路上,文中可能存在不当之处,欢迎各位多指教! 如果文章对您有用,那么请点个”推荐“,以资鼓励!
欢迎各位加我主页weixin,备注“博客园”,进入技术交流群,和我一起讨论和交流,共同进步!
分类:
Java
, Spring Boot
标签:
Spring Boot
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 上周热点回顾(3.3-3.9)
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具