SpringBoot 定时任务实践:从入门到多线程解决方案
创作时间:
作者:
@小白创作中心
SpringBoot 定时任务实践:从入门到多线程解决方案
引用
CSDN
1.
https://blog.csdn.net/festone000/article/details/137496081
Q1. SpringBoot怎样创建定时任务?
创建SpringBoot定时任务非常简单,只需在需要执行定时任务的方法上添加@Scheduled
注解,并指定cron表达式即可。
@Scheduled(cron = ".....")
Q2. 如上所示创建了定时任务却未能执行是为什么?
如果确认cron表达式没有写错,但定时任务仍然未能执行,可能是由于启动类缺少@EnableScheduling
注解。确保在启动类中添加此注解。
Q3. 多个定时任务,未能严格按照指定的时间执行,为什么?
在SpringBoot中,定时任务默认是单线程执行的。如果多个定时任务需要在不同时间点执行,但前一个任务执行时间过长,会导致后续任务延迟执行。
例如,有4个定时任务分别在每天凌晨1点、2点、3点和4点执行。如果第一个任务执行了1.5小时,那么第二个任务将在2点半开始执行,依此类推。
Q4. 如何确保定时任务在特定时间执行?
要确保定时任务在特定时间执行,可以使用多线程。具体步骤如下:
Step 1:初始化线程池
创建一个线程池配置类SchedulerConfig
,并实现SchedulingConfigurer
接口。
package cn.xxx.starter.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
@Configuration
public class SchedulerConfig implements SchedulingConfigurer {
@Resource
private ThreadPoolTaskScheduler threadPoolTaskScheduler;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.setTaskScheduler(threadPoolTaskScheduler);
}
}
创建线程池配置类ThreadPoolTaskSchedulerConfig
,并配置线程池参数。
package cn.xxx.starter.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.EnableAsync;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
@Configuration
@EnableAsync
public class ThreadPoolTaskSchedulerConfig {
private int corePoolSize = 4;
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(corePoolSize);
threadPoolTaskScheduler.setThreadNamePrefix("AsyncJob-thread-");
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
threadPoolTaskScheduler.setAwaitTerminationSeconds(60 * 60);
threadPoolTaskScheduler.initialize();
return threadPoolTaskScheduler;
}
}
Step 2:启动定时任务时指定使用此线程池
在定时任务类中,使用@Async
注解指定使用自定义线程池。
package cn.xxx.starter.task.job;
import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Async;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class Job1 {
@Async(value = "threadPoolTaskScheduler")
@Scheduled(cron = "0 30 */1 * * ?")
public void execute() {
try {
//......
} catch (Exception e) {
log.error("Job1出错 e = {}, stackTrace = {} ", e.getMessage(), JSON.toJSONString(e.getStackTrace()));
} finally {
log.info("Job1结束");
}
}
}
通过以上配置,可以确保多个定时任务在指定时间点并行执行,避免因单线程执行导致的延迟问题。
热门推荐
Bug是如何产生的?
节后金价涨疯,全球购金仍然火热
SIP协议你了解多少?(凭借何种特性助力实时通信)
从车库到帝国:苹果创业初期的成功秘诀
小红书运营新策略:以用户为中心,四步打造品牌高效种草之路
五本好书带你探寻人生意义
慢性头晕?六味地黄丸来帮忙
史上最全手机发展史,还记得那些年我们用过的手机吗?
新电车比二手车还便宜,车商:除了特斯拉和蔚来,都不敢收
保时捷新款Cayenne上市:命名背后的商业逻辑与文化内涵
C/C++代码性能优化——编程实践
央行释放重要信号!两项创新工具助力股市稳健发展
时隔四年全面盈利!苏宁易购踏入增长新阶段
王堃阳教你如何通过沟通改善人际关系
西安租赁合同签约指南:房屋与车牌租赁要点详解
嵌入式开发:从零到大佬的学习秘籍
提升团队执行力的四大关键要素
4个惊艳的AI项目,开源了!

市场估值:商业经营决策的关键
EPS、ROA、ROE、本益比是什麼?股票投資新手必懂9大指標
家居用品有哪些种类
猫咪外貌大观:从体型到毛色,揭秘猫科动物的独特魅力
云计算平台的性能衡量与评估是什么
分手后的情感恢复秘籍:5招助你重拾笑容!
罗庸先生事略
备战2025国省考:高效模拟面试技巧
各地探索推动非遗艺术传承创新皮影戏木偶戏 尽显独特魅力
生物质发电厂:绿色能源新星崛起
曾国藩告诉你:如何破解“富不过三代”魔咒
八字五行预测事业运势:以乙木日主为例