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");
    }
}
  1. 启动任务
//启动任务
  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)

fixedDelay

  1. fixedRate:上一次开始执行时间和下次开始时间间隔10s。如:
@Scheduled(fixedRate = 10000)

fixedEate

  1. initialDelay:第一次延迟多长时间后再执行。
@Scheduled(initialDelay=1000, fixedRate=5000) //第一次延迟1秒后执行,之后按fixedRate的规则每5秒执行一次
  1. 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 注解标记它以实现异步执行:
    在这里插入图片描述

  • 16
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

这河里吗l

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值