Spring Boot实现定时任务

📅 发布时间:2026/7/6 15:27:31 👁️ 浏览次数:
Spring Boot实现定时任务
目录1.什么是定时任务2.Timer的使用3.Spring Task的使用Api说明配置类启用定时任务支持配置定时任务多线程异步定时任务1.什么是定时任务定时任务是指在预定的时间点或按照特定的时间间隔自动执行的任务。定时任务的应用场景操作系统维护例如定期清理临时文件、更新系统补丁等。数据备份定期对重要数据进行备份以防数据丢失。自动化测试例如在每天凌晨自动运行软件测试脚本。网站维护比如定时发布新内容、定时发送邮件提醒等。数据分析例如定期汇总和分析业务数据生成报告。2.Timer的使用在特定时间执行任务只执行一次public void schedule(TimerTask task,Date time)在特定时间之后执行任务只执行一次public void schedule(TimerTask task,long delay)指定第一次执行的时间然后按照间隔时间重复执行public void schedule(TimerTask task,Date firstTime,long period)在特定延迟之后第一次执行然后按照间隔时间重复执行public void schedule(TimerTask task,long delay,long period)第一次执行之后特定频率执行与3同public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)在delay毫秒之后第一次执行后按照特定频率执行public void scheduleAtFixedRate(TimerTask task,long delay,long period)参数delay 延迟执行的毫秒数即在delay毫秒之后第一次执行period重复执行的时间间隔示例配置任务类//配置任务类public class MyTask1 extends TimerTask {Overridepublic void run(){System.out.println(“task1 run”);}}启动任务//启动任务public static void main(String[] args) {Timer timer new Timer();延迟1秒启动每1秒执行一次timer.schedule(new MyTask1(), 1000, 1000);}3.Spring Task的使用Spring Task 是 Spring 框架提供的一种轻量级的任务调度解决方案主要用于在 Java 应用程序中执行定时任务。Spring Task 提供了简单且强大的任务调度功能适用于各种规模的应用程序。Api说明fixedDelay上次结束到下次开始执行时间间隔Scheduled(fixedDelay 4000)fixedRate上一次开始执行时间和下次开始时间间隔10s。如Scheduled(fixedRate 10000)initialDelay第一次延迟多长时间后再执行。Scheduled(initialDelay1000, fixedRate5000) //第一次延迟1秒后执行之后按fixedRate的规则每5秒执行一次Cron表达式Cron表达式是由若干数字、空格、符号按一定的规则组成的一组字符串从而表达时间的信息。Cron 表达式是一个字符串分为 6 或 7 个域每一个域代表一个含义Cron 有如下两种语法格式[秒] [分] [小时] [日] [月] [周] [年][秒] [分] [小时] [日] [月] [周]字段是否必填允许填写的值允许的通配符秒是0-59, - * /分是0-59, - * /小时是0-23, - * /日是1-31, - * ? / L W月是1-12 or JAN-DEC, - * /周是1-7 or SUN-SAT, - * ? / L #年否留空 或 1970-2099, - * /通配符说明:星号*表示所有值 ~~~~ 例如:在分的字段上设置 “*”,表示每一分钟都会触发。减号-表示区间 ~~~~~~ 例如在小时上设置 “10-12”,表示 10,11,12点都会触发。逗号,列出枚举 ~~~~~~ 例如在分钟里5,15表示5分钟和20分钟触发斜杠/指定增量 ~~~~~~~ 例如在分钟里3/15”表示从3分钟开始没隔15分钟执行一次问号? 只在日期域和星期域中使用表示忽略该字段 ~~~~ 例如:要在每月的10号触发一个操作但不关心是周几所以需要周位置的那个字段设置为 具体设置为 0 0 0 10 *L 表示last例如星期中表示7或SAT月份中表示最后一天31或306L表示这个月倒数第6天FRIL表示一个星期五W 只能用在月份中表示最接近指定天的工作日# 只能用在星期中表示这个月的第几个周几例如6#3表示这个月的第3个周五可通过在线生成Cron表达式的工具https://www.bejson.com/othertools/cron/来生成自己想要的表达式。常用示例表达式含义0 * * * * ?每1分钟触发一次0 0 * * * ?每天每1小时触发一次0 0 10 * * ?每天10点触发一次0 * 14 * * ?在每天下午2点到下午2:59期间的每1分钟触发0 30 9 1 * ?每月1号上午9点半0 15 10 15 * ?每月15日上午10:15触发*/5 * * * * ?每隔5秒执行一次0 */1 * * * ?每隔1分钟执行一次0 0 5-15 * * ?每天5-15点整点触发0 0/3 * * * ?每三分钟触发一次0 0 0 1 * ?每月1号凌晨执行一次配置类启用定时任务支持EnableScheduling public class App { }配置定时任务Component Slf4j public class ScheduledTask { ? //上一次开始执行时间和下次开始时间间隔5s Scheduled(fixedRate 5000) public void fixedRateTask() { log.debug(fixedRateTask); } ? //上次结束到下次开始执行时间间隔5s Scheduled(fixedDelay 5000) public void fixedDelayTask() { log.debug(fixedDelayTask); ? } //第一次延迟6秒后执行然后每2s循环执行 Scheduled(initialDelay 6000,fixedDelay 2000) public void initialDelayTask() { log.debug(initialDelayTask); } ? //使用corn表达式每5s执行一次 Scheduled(cron 0/5 * * * * ?) public void cron() { log.debug(cronTask执行); } ? }多线程异步定时任务配置线程池Component public class ExecutorConfig { //定义核心线程数 public static final int CORE_POOL_SIZE 10; // 最大线程数 public static final int MAX_POOL_SIZE 20; // 任务队列容量大小 public static final int QUEUE_MAX_COUNT 100; Bean(asyncScheduledPool) public Executor asyncScheduledPool(){ //自定义线程池 ThreadPoolTaskExecutor threadPoolExecutor new ThreadPoolTaskExecutor(); //设置核心线程数 threadPoolExecutor.setCorePoolSize(CORE_POOL_SIZE); //设置最大线程数 长工 临时工 threadPoolExecutor.setMaxPoolSize(MAX_POOL_SIZE); //设置任务队列容量大小 threadPoolExecutor.setQueueCapacity(QUEUE_MAX_COUNT); //设置线程的名称前缀 threadPoolExecutor.setThreadNamePrefix(myTask-); //设置拒绝策略 threadPoolExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy()); return threadPoolExecutor; } }开启异步支持要在 Spring Boot 应用中启用异步方法调用需在启动类上添加EnableAsync注解。定义异步方法在服务类中定义一个方法并使用Async注解标记它以实现异步执行