Spring Boot实现定时任务

目录

1.什么是定时任务

定时任务是指在预定的时间点或按照特定的时间间隔自动执行的任务。

定时任务的应用场景:

  • 操作系统维护:例如,定期清理临时文件、更新系统补丁等。
  • 数据备份:定期对重要数据进行备份,以防数据丢失。
  • 自动化测试:例如,在每天凌晨自动运行软件测试脚本。
  • 网站维护:比如定时发布新内容、定时发送邮件提醒等。
  • 数据分析:例如,定期汇总和分析业务数据,生成报告。

2.Timer的使用

  1. 在特定时间执行任务,只执行一次

    复制代码
    public void schedule(TimerTask task,Date time)
  2. 在特定时间之后执行任务,只执行一次

    复制代码
    public void schedule(TimerTask task,long delay)
  3. 指定第一次执行的时间,然后按照间隔时间,重复执行

    复制代码
    public void schedule(TimerTask task,Date firstTime,long period)
  4. 在特定延迟之后第一次执行,然后按照间隔时间,重复执行

    复制代码
    public void schedule(TimerTask task,long delay,long period)
  5. 第一次执行之后,特定频率执行,与3同

    复制代码
    public void scheduleAtFixedRate(TimerTask task,Date firstTime,long period)
  6. 在delay毫秒之后第一次执行,后按照特定频率执行

    复制代码
    public void scheduleAtFixedRate(TimerTask task,long delay,long period)

参数:

  • delay: 延迟执行的毫秒数,即在delay毫秒之后第一次执行
  • period:重复执行的时间间隔

示例:

  1. 配置任务类

    //配置任务类

    public class MyTask1 extends TimerTask {

    @Override

    public void run(){

    System.out.println("task1 run");

    }

    }

  2. 启动任务

    //启动任务

    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说明
  1. fixedDelay :上次结束到下次开始执行时间间隔:

    @Scheduled(fixedDelay = 4000)

  1. fixedRate:上一次开始执行时间和下次开始时间间隔10s。如:

    @Scheduled(fixedRate = 10000)

  1. initialDelay:第一次延迟多长时间后再执行。

    @Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次

  2. Cron表达式

Cron表达式是:由若干数字、空格、符号按一定的规则,组成的一组字符串,从而表达时间的信息

Cron 表达式是一个字符串,分为 6 或 7 个域,每一个域代表一个含义

Cron 有如下两种语法格式:

  1. [秒] [分] [小时] [日] [月] [周] [年]
  2. [秒] [分] [小时] [日] [月] [周]

字段

是否必填

允许填写的值

允许的通配符

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或30,6L表示这个月倒数第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执行");
        }      
?
}
多线程(异步)定时任务
  1. 配置线程池

    复制代码
    @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;
        }
    }
  2. 开启异步支持:

    要在 Spring Boot 应用中启用异步方法调用,需在启动类上添加 @EnableAsync 注解。

  3. 定义异步方法:

    在服务类中定义一个方法,并使用 @Async 注解标记它以实现异步执行:

相关推荐
菜菜小狗的学习笔记18 小时前
八股(三)Java并发
java·开发语言
云烟成雨TD19 小时前
Spring AI Alibaba 1.x 系列【10】ReactAgent 工具加载和执行流程
java·人工智能·spring
lee_curry19 小时前
JUC第一章 java中基础概念和CompletableFuture
java·多线程·并发·juc
迷藏49419 小时前
**超融合架构下的Go语言实践:从零搭建高性能容器化微服务集群**在现代云原生时代,*
java·python·云原生·架构·golang
それども19 小时前
Spring Bean @Autowired自注入空指针问题
java·开发语言·spring
如来神掌十八式19 小时前
Java所有的锁:从基础到进阶
java·
硅基诗人19 小时前
Java后端高并发核心瓶颈突破(JVM+并发+分布式底层实战)
java·jvm·分布式
聆听。。花开雨落19 小时前
intelij idea闪退后再启动tomcat报错端口冲突
java·tomcat·intellij-idea
Java面试题总结19 小时前
Spring Boot 包扫描新姿势:AutoScan vs @Import vs @ComponentScan 深度对比
java·数据库·spring boot
掘金者阿豪19 小时前
数据库安全第一关:用户密码存储与认证机制的深度拆解
java·前端·后端