Spring4.0编程式定时任务配置
看过很多定时调度的配置,大多使用XML配置,觉得比较麻烦,也比较老套。这里介绍一种基于spring4.0注解编程式配置定时任务,简单清晰,使用方便..
至于引入spring相关jar这里不多说,直接切入正题贴上代码:
@Configuration @EnableScheduling public class WebAppConfig implements SchedulingConfigurer { //TaskScheduler configuration @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { logger.info("Configure task registor: {}", taskRegistrar); taskRegistrar.setScheduler(taskExecutor()); } @Bean(destroyMethod="shutdown") public Executor taskExecutor() { return Executors.newScheduledThreadPool(4); } }
思路:
我们通常将用于存放配置信息类的类名以 “Config” 结尾,如上我们在WebAppConfig里通过 @Configuration注解,指出该类是Bean配置的信息源,再通过@EnableScheduling开启定时调度,一般情况下实际项目中都是多线程执行定时任务的,所以我们可以通过实现SchedulingConfigurar接口,访问底层的ScheduledRegistrar实例,产生一个Executer对象,然后根据系统的承受能力调整线程池中工作线程的数目,这里我启了4个线程。注意上面使用的@bean(destroyMethod="shutdown")是为了确保当Spring应用上下文关闭的时候任务执行者也被正确地关闭。
使用:
@Component("user.task") public class userTaskJob { /** * 每月第一天凌晨一点执行 */ @Scheduled(cron="0 0 01 01 * ?") public void tempUserTaskDelete() { //do something } }
cron表达式简要介绍:
一个cron表达式有至少6个(也可能7个)有空格分隔的时间元素。依次顺序为:
- 秒(0~59)
- 分钟(0~59)
- 小时(0~23)
- 天(月)(0~31,需要考虑月的天数)
- 月(0~11)
- 天(星期)(1~7 1=SUN 或 SUN,MON,TUE,WED,THU,FRI,SAT)
- 年份(1970-2099)
常用符号代表意思:
- * 字符代表所有可能的值。因此,* 在子表达式(月)里表示每个月的含义,* 在子表达式(天(星期))表示星期的每一天
- ?字符仅被用于天(月)和天(星期)两个子表达式,表示不指定值当2个子表达式其中之一被指定了值以后,为了避免冲突,需要将另一个子表达式的值设为“?”
- / 字符表示起始时间开始触发,然后每隔固定时间触发一次,例如在Minutes域使用5/20,则意味着5分钟触发一次
几个示例:
- 每天的凌晨4点 @Scheduled(cron = "0 0 4 * * *")
- 每周日的凌晨5点 @Scheduled(cron = "0 0 5 * * SUN")
- 每月第一天凌晨2点10分 @Scheduled(cron="0 10 02 01 * ?")
- 每天从下午2点开始到2点55分结束每隔5分钟触发一次 @Schedule(cron = "0 0/5 14 * * ?")
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?