技术派@Schedule注解实现定时任务
定时任务在实际的工作中属于一项基本技能,在相对成熟的项目中,可能更多接触到的是借助xxl-job, elastic-job等来实现的分布式定时任务;在技术派项目中,当然也会介绍到定时任务这必须掌握的知识点
针对定时任务的系列教程,我们将从单机的Spring Sechedule定时任务到借助成熟的三方组件来实现的分布式定时任务逐一进行介绍说明;当然学习得由简入深,我们先来看一下基于Spring的单机定时任务是怎么来玩的
使用实例
在技术派中,直接全局搜索@Scheduled就可以找到使用的地方

应用场景
com.github.paicoding.forum.service.sitemap.service.SitemapServiceImpl#autoRefreshCache
/**
* 采用定时器方案,每天5:15分刷新站点地图,确保数据的一致性
*/
@Scheduled(cron = "0 15 5 * * ?")
public void autoRefreshCache() {
log.info("开始刷新sitemap.xml的url地址,避免出现数据不一致问题!");
refreshSitemap();
log.info("刷新完成!");
}
上面这个定时任务干的时间也很简单,每天5:15分刷新站点地图,用于seo的sitemap.xml文件生成
若我们的实际项目中需要使用定时任务,还需要主动开启,一般常见于在启动类上,添加注解@EnableScheduling

基于上面的配置完成之后,一个定时任务就算是完成了; 整体的使用感官上来说,非常简单
基本知识点
从技术派的使用角度来看,会发现很简单,没什么可说的;但是,这里面涉及到的知识点其实非常多,我们来逐一进行说明
cron表达式
Cron表达式是一个字符串,字符串以5或6个空格隔开,分为6或7个域,每一个域代表一个含义,Cron有如下两种语法格式:
Seconds Minutes Hours DayofMonth Month DayofWeek Year
Seconds Minutes Hours DayofMonth Month DayofWeek
上面每个坑位,可以取得值不一样,先分别说明几个可能见到的符号
*: 表示匹配该域的任意值,如分钟的坑位为*, 表示每分钟都会触发?: 只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和 DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法:13 13 15 20 ?-: 表示范围,例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次。/: 表示起始时间开始触发,然后每隔固定时间触发一次
- 如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次
,: 表示列出枚举值值。
-
...
未能定位到原文的划线
企业级Agent工作流编排项目PaiFlow
Vibe Coding版本的PaiAgent
派聪明RAG AI知识库Java版本+Go版本
微服务 PmHub、技术派、MYDB
求职派JobClaw(OpenClaw/Hermes架构
PaiCLI(类似Claude Code的Agent
派简历(代码已完成)
等实战项目。
1. 微信扫右侧的优惠券加入知识星球
2. 解锁星球的实战项目教程和源码: 项目源码+教程获取
真诚点赞 诚不我欺
回复