首页 > 其他分享 >SpringBoot如何使用@Scheduled创建定时任务?

SpringBoot如何使用@Scheduled创建定时任务?

时间:2023-12-03 12:32:04浏览次数:46  
标签:Scheduled SpringBoot 注释 任务 定时 执行 间隔时间

前言

随着软件业务日益复杂,有时候需要创建一些定时任务以满足特定业务需求。在Java编程语言中,使用Spring框架可以轻松地创建出定时任务。

SpringBoot作为Spring框架中的一员,在创建定时任务方面也提供了便利性和灵活性。

本文将介绍SpringBoot如何使用@Scheduled创建定时任务。

摘要

本文主要包括以下内容:

  • 源代码解析
  • 应用场景案例
  • 优缺点分析
  • 类代码方法介绍
  • 测试用例
  • 全文小结
  • 总结

简介

SpringBoot中提供了@Scheduled注释,该注释是用来声明一个方法是计划任务的方法。@Scheduled被定义在org.springframework.scheduling.annotation包下。

SpringBoot支持各种类型的计划任务,例如固定间隔调用、固定延迟调用、CRON表达式调用等。

下面是一个简单的使用@Scheduled注释的示例:

@Component
public class MyScheduler {
 
    @Scheduled(fixedDelay = 1000)
    public void scheduleTaskWithFixedDelay() {
        // 代码块
    }
 
    @Scheduled(fixedRate = 2000)
    public void scheduleTaskWithFixedRate() {
        // 代码块
    }
 
    @Scheduled(cron = "0 0 12 * * ?")
    public void scheduleTaskWithCronExpression() {
        // 代码块
    }
}

在上面的示例中,我们创建了一个MyScheduler类,并使用@Component注释将该类声明为Spring组件。然后我们在该类中定义了三个方法,每个方法都使用@Scheduled注释声明为一个计划任务方法。

第一个方法scheduleTaskWithFixedDelay()使用fixedDelay属性声明一个固定间隔任务,每1秒执行一次。

第二个方法scheduleTaskWithFixedRate()使用fixedRate属性声明一个固定速率任务,每2秒执行一次。

第三个方法scheduleTaskWithCronExpression()使用cron属性声明一个基于CRON表达式的计划任务,该任务在每天中午12点触发。

源代码解析

@Scheduled注释有多个属性,每个属性都用来定义计划任务的执行方式。下面是@Scheduled注释的常见属性列表:

  • fixedDelay:固定间隔时间,执行完毕后等待指定的间隔时间(单位毫秒)后执行下一次任务。
  • fixedRate:固定速率时间,从上一次开始执行到本次开始执行的间隔时间(单位毫秒),不考虑执行时间。
  • initialDelay:初始化延迟时间,第一次执行之前要等待的时间(单位毫秒)。
  • cron:CRON表达式,用于执行任务的时间计划。例如:"0 0 12 * * ?"表示每天中午12点执行该任务。
  • zone:时区,默认为当前系统时区。

需要注意的是,以上各个属性中的时间单位均为毫秒。

应用场景案例

  1. 定时任务执行某些特定业务。

例如,每天清除某些临时文件、每周计算某些数据等等。

  1. 定时任务进行监控。

例如,每隔一段时间对服务器状态进行检查、监控数据库是否正常等等。

  1. 定时任务进行消息提醒。

例如,每天定时发送某些邮件提醒、每月定时发送统计数据等等。

优缺点分析

优点:

  1. 简单易用。

SpringBoot提供了@Scheduled注释,使得创建定时任务非常方便,开发人员只需定义好任务的执行方式即可。

  1. 灵活可配置。

SpringBoot支持多种计划任务的执行方式,并且可以配置不同的属性来满足不同的业务需求。

缺点:

  1. 任务间隔时间不可靠。

由于计划任务的执行时间取决于前一次任务的执行时间和任务的间隔时间,所以计划任务的执行间隔时间可能会出现偏差,导致任务的执行不够准确。

  1. 不适用于复杂业务。

如果需要执行的任务比较复杂、耗时较长,那么使用@Scheduled注释可能会影响系统的性能和稳定性。

类代码方法介绍

下面是@Scheduled注释中常用的属性及其含义:

  • fixedDelay:固定间隔时间,执行完毕后等待指定的间隔时间(单位毫秒)后执行下一次任务。
  • fixedRate:固定速率时间,从上一次开始执行到本次开始执行的间隔时间(单位毫秒),不考虑执行时间。
  • initialDelay:初始化延迟时间,第一次执行之前要等待的时间(单位毫秒)。
  • cron:CRON表达式,用于执行任务的时间计划。例如:"0 0 12 * * ?"表示每天中午12点执行该任务。
  • zone:时区,默认为当前系统时区。

下面是示例代码:

@Component
public class MyScheduler {
 
    /**
     * 固定间隔时间
     */
    @Scheduled(fixedDelay = 1000)
    public void scheduleTaskWithFixedDelay() {
        // 代码块
    }
 
    /**
     * 固定速率时间
     */
    @Scheduled(fixedRate = 2000)
    public void scheduleTaskWithFixedRate() {
        // 代码块
    }
 
    /**
     * 初始化延迟时间
     */
    @Scheduled(initialDelay = 1000, fixedRate = 2000)
    public void scheduleTaskWithInitialDelay() {
        // 代码块
    }
 
    /**
     * 基于CRON表达式的计划任务
     */
    @Scheduled(cron = "0 0 12 * * ?")
    public void scheduleTaskWithCronExpression() {
        // 代码块
    }
 
}

在上面的示例中,我们创建了一个MyScheduler类,并使用@Component注释将该类声明为Spring组件。然后我们在该类中定义了四个方法,每个方法都使用@Scheduled注释声明为一个计划任务方法。

第一个方法scheduleTaskWithFixedDelay()使用fixedDelay属性声明一个固定间隔任务,每1秒执行一次。

第二个方法scheduleTaskWithFixedRate()使用fixedRate属性声明一个固定速率任务,每2秒执行一次。

第三个方法scheduleTaskWithInitialDelay()使用initialDelay属性声明初始化延迟时间为1秒,并使用fixedRate属性声明一个固定速率任务,每2秒执行一次。

第四个方法scheduleTaskWithCronExpression()使用cron属性声明一个基于CRON表达式的计划任务,该任务在每天中午12点触发。

测试用例

在测试用例中,我们将演示如何使用@Scheduled注释创建定时任务。

@SpringBootTest
class DemoApplicationTests {
 
    @Test
    void contextLoads() {
    }
 
}

我们在contextLoads()方法中创建一个计划任务,并验证任务是否能够按照我们的期望执行。

@SpringBootTest
class DemoApplicationTests {
 
    @Autowired
    private MyScheduler myScheduler;
 
    @Test
    void contextLoads() throws InterruptedException {
 
        // 等待任务执行
        Thread.sleep(5000);
 
        // 验证任务是否执行
        Mockito.verify(myScheduler, Mockito.times(2)).scheduleTaskWithFixedDelay();
        Mockito.verify(myScheduler, Mockito.times(2)).scheduleTaskWithFixedRate();
        Mockito.verify(myScheduler, Mockito.times(2)).scheduleTaskWithInitialDelay();
        Mockito.verify(myScheduler, Mockito.times(2)).scheduleTaskWithCronExpression();
    }
 
}

在上面的示例中,我们首先在Test类中使用@Autowired注释注入了MyScheduler组件,在contextLoads()方法中等待任务执行,并通过Mockito.verify()。

全文小结

本文主要介绍了SpringBoot如何使用@Scheduled注释创建定时任务。我们首先介绍了@Scheduled注释的常见属性,并演示了如何在代码中使用@Scheduled注释创建不同类型的计划任务。

接着,我们讨论了@Scheduled注释的优缺点,指出了该注释在简单业务场景中的便利性和灵活性,但也存在一些缺陷,如任务间隔时间不可靠和不适用于复杂业务。

最后,我们提供了一个简单的测试用例,演示了如何验证计划任务是否能够按照我们的期望执行。

总的来说,使用@Scheduled注释可以实现简单的定时任务调度,但对于复杂的业务场景,还需要考虑更全面的调度策略和任务执行监控。

总结

通过本文我们了解到了SpringBoot如何使用@Scheduled创建定时任务,包括常见属性的解释和使用方式,以及优缺点和测试用例的演示。

在实际开发中,我们可以根据不同的业务需求选择合适的计划任务方式,从而实现定时任务的调度。同时,我们也需要注意任务执行时间和任务间隔时间的精度和可靠性,以保证系统的稳定性和可靠性。

标签:Scheduled,SpringBoot,注释,任务,定时,执行,间隔时间
From: https://blog.51cto.com/u_15700751/8666671

相关文章

  • 整合springboot+mybatisplus+mysql+swagger,开发后端接口
    一、版本1.springboot:2.7.82.mybatisplus:3.5.3.13.mysql:8.04.swagger:3.0二、建立数据表(省略表结构)三、新建maven工程及springboot项目1.完成后的项目目录:2.maven工程的pom文件引入依赖:点击查看代码<?xmlversion="1.0"encoding="UTF-8"?><projectxmlns="http......
  • 基本定时器TIM6实现精确延时
    1、基本定时器的特点(1)、16位自动重装载累加计数器(2)、16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1~65536之间的任意数值!!!注意基本定时器只有向上计数模式,不要被框图和数据手册上的一些描述误导,基本定时器寄存器中根本没有计数模式的配置相关位。2、基本定时器的配......
  • django-apschedule定时任务异常停止
    背景在django项目中使用django-apschedule来实现定时任务,使用的是BackgroundScheduler调度类,该调度的实现是通过后台线程的方式执行定时任务。其中任务都是持久化到数据库中的。在项目的运行过程中,因为数据库的异常,导致定时任务线程异常终止,即使数据库后续恢复正常,但也不再继续执行......
  • SpringBoot自定义注解导出Excel
    先定义一个注解importjava.lang.annotation.Retention;importjava.lang.annotation.RetentionPolicy;@Retention(RetentionPolicy.RUNTIME)public@interfaceExcelHander{Stringvalue()default"";StringlinkFiled()default"";Cel......
  • 在使用SpringBoot装配mybatis时出现异常
    在使用SpringBoot装配mybatis时出现异常***************************APPLICATIONFAILEDTOSTART***************************Description:FieldstudentServiceincom.example.demo.action.StudentControllerrequiredabeanoftype'com.example.demo.service.Stude......
  • 2023版SpringBoot2 仿B站高性能前端+后端项目开发全流程
    2023版SpringBoot2仿B站高性能前端+后端项目51xuebc+尾缀SpringBoot2仿B站高性能前端+后端项目:打造高效、稳定、可扩展的应用在当今的互联网时期,网站的性能、稳定性和可扩展性成为了权衡一个项目胜利与否的关键要素。本文将引见如何运用SpringBoot2构建一个仿B站的高性能前......
  • springboot 启动命令过长问题处理(Error running 'xxxxApplication': Command line is
      翻译搜索复制......
  • springboot创建线程池
    1.线程池的配置:@ConfigurationpublicclassThreadPoolConfig{@Bean(name="myThreadPool")//告诉你这个线程池的名字publicThreadPoolTaskExecutorthreadPoolTaskExecutor(){ThreadPoolTaskExecutorexecutor=newThreadPoolTaskExecutor();ex......
  • springboot如何用jar包启动,同时为不同机房设置不同的配置文件
    1、首先先把配置文件从jar中抽离示例代码:<plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-jar-plugin</artifactId><version>3.2.0</version><configuration><excludes>......
  • springboot云HIS信息管理系统
    系统功能:为居民建立一份动态、连续、实时、共享的个人电子健康档案,包括家庭和个人信息采集、编辑、常见病诊疗、疾病预防控制服务和健康教育。针对基层医院的业务特点,实现以财务核算为基础,以临床医疗服务为中心的全程信息化管理,主要包括以下业务模块:门诊住院收费管理、以电子病历......