Spring Boot非分布式任务调度解决方案实战

在项目开发过程中,经常需要定时任务来做一些内容,比如定时进行数据统计(阅读量统计),数据更新(生成每天的歌单推荐)、爬虫程序定时启动爬取数据等。这些定时任务就是说的大气一点就是“任务调度”,需要用到任务调度框架。任务调度框架可以分为分布式任务调度框架和非分布式任务调度框架。

Spring Boot已经内置实现了一种非分布式的任务调度框架Scheduled,我们只需要添加相应的注解就可以完成定时任务的配置。下面分两步来配置一个定时任务,并实现用多线程和异步方式来进行任务调度:

  1. 创建定时任务
  2. 启动类添加注解
  3. 多线程的支持
  4. 异步的支持

创建定时任务

这里需要用到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等。

posted @   James_Shangguan  阅读(471)  评论(0编辑  收藏  举报
编辑推荐:
· 从 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生成工具
点击右上角即可分享
微信分享提示