快速上手,spring boot3整合task实现定时任务

在已经上线的项目中,定时任务是必不可少的。基于spring boot自动装配的原理,我们要集成task定时任务还是非常简单的。只需要简单的两步就可以实现。

1、创建一个spring boot项目,并在项目的启动类(也不一定非要是启动类,只要@Configuration注解标识过的配置类就行)上加@EnableScheduling注解。这个注解用于开启定时任务的支持

@SpringBootApplication
@EnableScheduling
public class Springjdk21TestApplication {

    public static void main(String[] args) {
        SpringApplication.run(Springjdk21TestApplication.class, args);
    }

}

2、直接在项目中使用定时任务即可。

创建一个bean。在这个bean中创建想要定时执行的方法,并在这个方法上加入@Scheduled注解即可。

@Component
public class TestTask {
/**
 * 定时任务,每隔5秒执行一次
 */
@Scheduled(fixedRate = 5000)
public void sayHello() {

    System.out.println("say hello========>"+ 
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));

}

}

fixedRate表示从启动项目开始,每个多少毫秒执行一次。

现在启动我们的主类,可以看到定时任务已经执行;

可以看到,每个5秒钟,控制台输出了一次打印语句。

当然,使用fixedRate参数只能实现简单的定时任务,假如我们的定时任务比较复杂呢。比如,我们要自定义任务的开始时间和执行间隔,这时fixedRate已经不能满足我们的需求了,我们需要使用另一种方法,cron表达式。

cron表达式是一种用于配置定时任务(计划任务)执行时间的字符串表达式

一个cron表达式由6或7个字段组成,分别表示如下时间单位:

  1. 秒(Seconds) - 0 - 59
  2. 分(Minutes) - 0 - 59
  3. 小时(Hours) - 0 - 23(24小时制)
  4. 日期(Day of Month) - 1 - 31
  5. 月份(Month) - 1 - 12JAN-DEC
  6. 星期几(Day of Week) - 0 - 7SUN-SAT(7或0表示星期天)
  7. 年份(Year,可选) - 1970 - 2099

字段之间使用空格分隔,表示时间的顺序。

(在标准的cron表达式中,通常是6个字段,不包括年份。但是,有些系统和应用允许扩展cron表达式到7个字段,加入年份字段。(7个字段)可能不被所有cron作业调度器支持,特别是在一些Unix/Linux系统中。在Java的Spring框架中,如果你使用**@Scheduled**注解,通常不需要指定年份,因为Spring的调度器默认不会扩展到7个字段。)

当然,现在的spring boot的高版本也不支持cron的7个参数了。cron表达式的设计初衷是为了在操作系统层面设置周期性的计划任务,而不是用来安排一次性的特定日期和时间。如果你需要在特定年份执行任务,你应该使用应用程序逻辑来处理年份,或者选择一个不同的调度方法来处理跨年度的任务。

特殊字符:

  • *:代表所有可能的值。例如,在分钟字段中使用*,表示每分钟。
  • ?:表示不指定值。只能在日期和星期几字段中使用。
  • -:表示一个范围。例如,10-12 小时 表示从上午10点到12点。
  • /:表示起始时间开始,每隔一定的间隔执行。例如,在分钟字段中使用0/30,表示每30分钟。
  • L:表示"Last",只能用于日期和星期几字段。例如,在日期字段使用L,表示月份的最后一天。
  • W:表示有效工作日(周一到周五),不能和L一起使用,只能用于日期字段。
  • #:表示星期几的第几个周。例如,6#3表示某月的第三个星期天。

一般,我们只需要知道cron表达式对应的含义就行,不需要我们自己进行编写。使用到的时候直接在往上搜一个在线的生成网址即可。

cron的在线生成网址:在线Cron表达式生成器 (qqe2.com)

我们需要的时候,直接使用图形化的界面点击生成相应的cron表示式即可。

* * 12 1 * ?

这个cron是我使用网址生成的,表示每个月1号的中午12点执行一次。

@Component
public class TestTask {
/**
 * 定时任务,每隔5秒执行一次
 */
@Scheduled(cron = "* * 12 1 * ?")
public void sayHello() {
    System.out.println("say hello========>"+
            new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
}

}

由于spring boot的自动装配,官方已经帮我们做了很多工作。我们只需要安装官方的约定,简单的做一些配置就可以轻松的实现绝大多数功能。

相关推荐
黄油饼卷咖喱鸡就味增汤拌孜然羊肉炒饭9 分钟前
SpringBoot如何实现缓存预热?
java·spring boot·spring·缓存·程序员
暮湫26 分钟前
泛型(2)
java
超爱吃士力架30 分钟前
邀请逻辑
java·linux·后端
南宫生35 分钟前
力扣-图论-17【算法学习day.67】
java·学习·算法·leetcode·图论
转码的小石43 分钟前
12/21java基础
java
李小白661 小时前
Spring MVC(上)
java·spring·mvc
GoodStudyAndDayDayUp1 小时前
IDEA能够从mapper跳转到xml的插件
xml·java·intellij-idea
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
n北斗2 小时前
常用类晨考day15
java
骇客野人2 小时前
【JAVA】JAVA接口公共返回体ResponseData封装
java·开发语言