惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

博客园 - Franky
N
Netflix TechBlog - Medium
Google Online Security Blog
Google Online Security Blog
月光博客
月光博客
量子位
酷 壳 – CoolShell
酷 壳 – CoolShell
V
V2EX
腾讯CDC
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
M
MIT News - Artificial intelligence
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
Hugging Face - Blog
Hugging Face - Blog
博客园 - 【当耐特】
Apple Machine Learning Research
Apple Machine Learning Research
aimingoo的专栏
aimingoo的专栏
博客园 - 三生石上(FineUI控件)
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
MongoDB | Blog
MongoDB | Blog
H
Help Net Security
The Cloudflare Blog
Blog — PlanetScale
Blog — PlanetScale
F
Full Disclosure
G
Google Developers Blog
罗磊的独立博客
Jina AI
Jina AI
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Y
Y Combinator Blog
H
Hackread – Cybersecurity News, Data Breaches, AI and More
J
Java Code Geeks
A
About on SuperTechFans
IT之家
IT之家
大猫的无限游戏
大猫的无限游戏
S
SegmentFault 最新的问题
有赞技术团队
有赞技术团队
GbyAI
GbyAI
雷峰网
雷峰网
T
The Blog of Author Tim Ferriss
The Register - Security
The Register - Security
U
Unit 42
D
Docker
Martin Fowler
Martin Fowler
L
LINUX DO - 热门话题
NISL@THU
NISL@THU
阮一峰的网络日志
阮一峰的网络日志
C
Cybersecurity and Infrastructure Security Agency CISA
博客园_首页
Google DeepMind News
Google DeepMind News

牛牛技术客栈

设计模式-备忘录模式 - OXOXTECH 牛牛技术客栈 设计模式-中介者模式 - OXOXTECH 牛牛技术客栈 Linux【Ubuntu】修改ssh默认端口 - OXOXTECH 牛牛技术客栈 设计模式-迭代器模式 - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(三) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(二) - OXOXTECH 牛牛技术客栈 Apriori - 基于关联规则的推荐算法(一) - OXOXTECH 牛牛技术客栈 基于JavaFX的桌面端网络调试工具 - OXOXTECH 牛牛技术客栈 Golang Channel的原理介绍 - OXOXTECH 牛牛技术客栈 Go语言Map的原理分析 - OXOXTECH 牛牛技术客栈 Go语言错误处理(panic)的最佳实践 - OXOXTECH 牛牛技术客栈 设计模式-解释器模式 - OXOXTECH 牛牛技术客栈 Redis报错Redis is configured to save RDB snapshots, but it's currently unable to persist to disk. go-webpbin库在Linux报错failed to encode image to WebP: exit status 1.......的问题 exe4j 打包加密的jar - OXOXTECH 牛牛技术客栈 Go生成图形验证码示例 - OXOXTECH 牛牛技术客栈 澳门一天游:一日尽享东方与西方的交融之美 - OXOXTECH 牛牛技术客栈 设计模式-命令模式 - OXOXTECH 牛牛技术客栈 别再自己瞎写工具类了,SpringBoot内置工具类应有尽有 - OXOXTECH 牛牛技术客栈 中山一日游 - OXOXTECH 牛牛技术客栈 设计模式-责任链模式 - OXOXTECH 牛牛技术客栈 起舞吧,齐舞吧 - OXOXTECH 牛牛技术客栈 设计模式-组合模式 - OXOXTECH 牛牛技术客栈 Go语言Web开发|GoFrame框架入门笔记 - OXOXTECH 牛牛技术客栈 Java打包exe教程 - OXOXTECH 牛牛技术客栈 设计模式-代理模式 - OXOXTECH 牛牛技术客栈 MySQL存储过程的优缺点有哪些? - OXOXTECH 牛牛技术客栈 前端渲染优化有哪些? - OXOXTECH 牛牛技术客栈 HTTP状态码及其含义 - OXOXTECH 牛牛技术客栈 从浏览器地址栏输入url到显示页面的步骤 - OXOXTECH 牛牛技术客栈 TypeScript事件派发管理器 - OXOXTECH 牛牛技术客栈 MQTT保留消息的使用方法 - OXOXTECH 牛牛技术客栈 世界工程-港珠澳大桥游 - OXOXTECH 牛牛技术客栈 Golang逃逸分析 - OXOXTECH 牛牛技术客栈 设计模式-享元模式 - OXOXTECH 牛牛技术客栈 牛牛成长记录 - OXOXTECH 牛牛技术客栈 ffmpeg常用命令 - OXOXTECH 牛牛技术客栈 设计模式-外观模式 - OXOXTECH 牛牛技术客栈 设计模式-装饰器模式 - OXOXTECH 牛牛技术客栈 设计模式-桥接模式 - OXOXTECH 牛牛技术客栈 5周年恋爱纪念日 - OXOXTECH 牛牛技术客栈 2024新年快乐,龙腾四海 - OXOXTECH 牛牛技术客栈 迎接新年:除夕的美好时刻 - OXOXTECH 牛牛技术客栈 设计模式-适配器模式 - OXOXTECH 牛牛技术客栈 设计模式-原型模式 - OXOXTECH 牛牛技术客栈 设计模式-建造者模式 - OXOXTECH 牛牛技术客栈 设计模式-工厂模式 - OXOXTECH 牛牛技术客栈 设计模式-单例模式 - OXOXTECH 牛牛技术客栈 SpringBoot在Linux环境下发送163邮件失败(No appropriate protocol (protocol is disabled or cipher suites are inappropriate)) 海与日落 - OXOXTECH 牛牛技术客栈 Swagger比较常用的注解 - OXOXTECH 牛牛技术客栈 猫🐱牛 - OXOXTECH 牛牛技术客栈 2023年最后一个晚霞 - OXOXTECH 牛牛技术客栈 Linux(Centos)部署Nginx教程 - OXOXTECH 牛牛技术客栈 Linux MySQL下载安装详细教程(CentOS版) - OXOXTECH 牛牛技术客栈 JavaFx打包成exe - OXOXTECH 牛牛技术客栈 Flux脚本语言入门教程 - OXOXTECH 牛牛技术客栈 演唱会出图 - OXOXTECH 牛牛技术客栈 Netty TCP解决粘包拆包 - OXOXTECH 牛牛技术客栈 SpringBoot实现订单超时取消的几种方案 - OXOXTECH 牛牛技术客栈 详解Java并发中的各种锁 - OXOXTECH 牛牛技术客栈 SpringBoot集成支付宝支付 - OXOXTECH 牛牛技术客栈 雪花算法:分布式系统唯一ID生成算法 - OXOXTECH 牛牛技术客栈 Java解决空指针的神器Optional - OXOXTECH 牛牛技术客栈 与兴一起 - OXOXTECH 牛牛技术客栈 Java17新特性详解与安装 - OXOXTECH 牛牛技术客栈 Jdk17安装+环境配置详细教程 - OXOXTECH 牛牛技术客栈 孤注一掷 - OXOXTECH 牛牛技术客栈 解决WinSCP经常断线重连 - OXOXTECH 牛牛技术客栈 内存不足导致Tomcat崩溃问题排查与解决办法 - OXOXTECH 牛牛技术客栈 influxDB初识,一个高效的时序数据库 - OXOXTECH 牛牛技术客栈 SpringBoot 服务接口限流方案 - OXOXTECH 牛牛技术客栈 Docker 安装 Portainer - OXOXTECH 牛牛技术客栈 Linux 安装Docker - OXOXTECH 牛牛技术客栈 物料宣传 - OXOXTECH 牛牛技术客栈 Java使用EMQX实现MQTT通信 - OXOXTECH 牛牛技术客栈 Java实现常见的排序算法 - OXOXTECH 牛牛技术客栈 FreeSwitch Windows安装教程 - OXOXTECH 牛牛技术客栈 MQTT单向SSL数据加密 - OXOXTECH 牛牛技术客栈 随性 - OXOXTECH 牛牛技术客栈 mysql报错Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggre的解决方案 Git Push项目报 push to origin/master was rejected 错误解决方案 游行记——珠海金沙滩与金湖公园之行 - OXOXTECH 牛牛技术客栈 Tomcat:解决Tomcat启动警告:"无法将资源添加到Web应用程序缓存中....请考虑增加缓存空间" 的问题 - OXOXTECH 牛牛技术客栈 励骏庞都广场,迷一般的皇宫 - OXOXTECH 牛牛技术客栈 Docker 常用命令集合 - OXOXTECH 牛牛技术客栈 ElasticSearch Windows版-安装教程 - OXOXTECH 牛牛技术客栈 Java去除对象中为null的字段 - OXOXTECH 牛牛技术客栈 我和我的青春 - OXOXTECH 牛牛技术客栈 Java实现螺旋矩阵算法: - OXOXTECH 牛牛技术客栈 Java直接内存分配和释放的理解 - OXOXTECH 牛牛技术客栈 FreeSwitch将默认数据库迁移至MySQL - OXOXTECH 牛牛技术客栈 别错过路上的风景,别错过刹那间的深情! - OXOXTECH 牛牛技术客栈 Viewer.js:一款强大的图片预览组件 - OXOXTECH 牛牛技术客栈 Java JDK Proxy和CGLib动态代理示例 - OXOXTECH 牛牛技术客栈 redis常用命令 - OXOXTECH 牛牛技术客栈 SpringBoot查询IP归属地 - OXOXTECH 牛牛技术客栈 Spring 事务失效的六种情况 - OXOXTECH 牛牛技术客栈 #张艺兴每时每刻# - OXOXTECH 牛牛技术客栈 Nginx常用命令及具体应用 - OXOXTECH 牛牛技术客栈
scheduled定时任务的三种基本实现方式 - OXOXTECH 牛牛技术客栈
军阁 · 2025-12-05 · via 牛牛技术客栈

军阁 Java Java, Spring Boot

前言

又是一年的年底,时间过得好快,项目都没做几个,两手空空,钱包空空一年就这样过去了。才发现好久没在这里发文章了,今天就水一篇 SpringBoot 的定时任务来弥补一下博主[坏笑]。话不多说,一共有三种⬇️

  • 第一种:基于注解 (@Scheduled)的方式
  • 第二种:基于接口 (SchedulingConfigurer)
  • 第三种:基于注解设定多线程定时任务

一、基于注解 (@Scheduled)的方式

这一种方式是 SpringBoot 自带的定时器(基于cron表达式),无需引入第三方jar,直接一个注解在public的方法上即可触发,但前提是类需要启用定时@EnableScheduling 下面使用一个简单的例子

@Component
@EnableScheduling
@Slf4j
public class TaskTest {

    @Scheduled(cron = "*/5 * * * * ?")
    public void task1(){
        log.info("hello world!");
    }
}

以上例子会每5秒输出 hello world!

20260116161552194.webp

@Scheduled 除过cron还有三种方式:fixedRate,fixedDelay,initialDelay

fixedRate 控制方法执行的间隔时间,是以上一次方法执行完开始算起,如上一次方法执行阻塞住了,那么直到上一次执行完,并间隔给定的时间后,执行下一次。

@Component
@EnableScheduling
@Slf4j
public class TaskTest {

    @Scheduled(fixedRate = 5000)
    public void task1(){
        log.info("task1");
    }

    @Scheduled(fixedRate = 6000)
    public void task2(){
        log.info("task2");
    }
}

20260116161217457.webp

fixedDelay 是以上一次结束时间为基准的延时执行,用法和fixedRate一致

initialDelay  表示在容器启动后,延迟x秒后再执行一次定时器。

@Component
@EnableScheduling
@Slf4j
public class TaskTest {

    @Scheduled(initialDelay = 5000, fixedDelay = 5000)
    public void task1(){
        log.info("initialDelay");
    }
}

以上会在容器启动后延迟5秒后输出,并在每5秒输出

20260116161605106.webp

Cron表达式解释

结构

cron表达式是一个字符串,分为6或7个域,每两个域之间用空格分隔,

其语法格式为:"秒域、分域、时域、日域、月域、周域、年域"

取值范围

取值符号(常用)
0~59的整数* - , /
0~59的整数* - , /
0~23的整数* - , /
1~31的整数* - , / ? L
1~12的整数或英文 JAN~DEC* - , /
1~7的整数或英文SUN~SAT* - , / ? L #
1970~2099的整数* - , /

一些常用的cron

可直接复制使用,自己微调一下就好了[辣眼睛]

Cron 表达式含义
*/5 * * * * ?每隔5秒钟执行一次
0 * /1 * * * ?每隔1分钟执行一次
0 0 1 * * ?每天1点执行一次
0 55 23 * * ?每天23点55分执行一次
0 0 23 L * ?每月最后一天23点执行一次
0 0 8 ? * L每周六8点执行一次
0 0 */2 ? * 6L每月最后一个周五,每隔2小时执行一次
0 15 10 ? * 5#3每月的第三个星期五上午10:15执行一次
0 0-5 14 * * ?在每天下午2点到下午2:05期间的每1分钟执行
0 15 10 ? * 2-6表示周一到周五每天上午10:15执行
0 15 10 ? * 6L每个月的最后一个星期五上午10:15执行
0 0 10,14,16 * * ?每天上午10点,下午2点,4点执行一次
0 0/30 9-17 * * ?朝九晚五工作时间内每半小时执行一次
0 0 12 ? * 4每个星期三中午12点执行一次
0 10,44 14 ? 3 4每年三月的星期三的下午2:10和2:44各执行一次
0 15 10 ? * 6#3每月的第三个星期五上午10:15执行一次
0 30 2 1 * ?每月一日凌晨2点30执行一次
10,20 * * * * ?每分钟的第10秒与第20秒都会执行
0 0 0 ? * 6#2每月的第2个星期的周5,凌晨执行

二、基于接口 (SchedulingConfigurer)

使用 @Scheduled 注解很方便,但缺点是当我们调整了执行周期的时候,需要重启应用才能生效,只适用测试环境和一些固定的场景。那么为了达到实时生效的效果,可以使用接口来完成定时任务,统一将定时器信息存放在数据库中。

本质就是利用数据库将cron表达式存储下来,在启动定时器的时候查询出相应的cron再放入定时器中执行,由于篇幅不易太长,下面免去数据库操作部分的解释,直接给出代码示例:

@Component
@EnableScheduling
@Slf4j
public class TaskTest implements SchedulingConfigurer {

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.addTriggerTask(this::task, t ->{
            // todo 假设此处的cron是从数据库查询出来的
            String cron = "*/5 * * * * ?";
            return new CronTrigger(cron).nextExecutionTime(t);
        });
    }

    private void task(){
        log.info("Interface-based scheduled tasks");
    }
}

以上代码本质就是使用一个触发器触发一个cron任务,这个任务可以是你的任意方法。

20260116161314628.webp

三、基于注解设定多线程定时任务

前面讲到了 @Scheduled 执行周期任务会受到上次一个任务的执行时间阻塞影响,那么可以开启多线程执行周期任务。

@Component
@EnableScheduling
@EnableAsync
@Slf4j
public class TaskTest  {
    @Async
    @Scheduled(fixedDelay = 5000)
    public void task1() throws InterruptedException {
        log.info("task1,{}",Thread.currentThread().getName());
        Thread.sleep(3000);
    }

    @Async
    @Scheduled(fixedDelay = 3000)
    public void task2(){
        log.info("task2,{}",Thread.currentThread().getName());
    }
}

其实用法都是一样的,只是多了两个注解,一个是开启异步 @EnableAsync ,一个是方法异步注解 @Async

20260116161333252.webp

最后

以上就简单介绍了一下Spring Boot的三种定时器的用法,不过,正常使用定时任务的以上三种方式足够你实现业务上的问题,还有更多其他的用法由于篇幅问题就不再延伸,希望广大网友可以评论区指出[头秃]

说点什么吧...

共 0 条评论