【SpringBoot专题】SpringBoot快速集成Spring Task实现定时任务

【SpringBoot专题】SpringBoot集成Spring Task快速实现定时任务

🕌背景

在很多业务场景需要我们某一特定的时刻去做某件任务,这些任务是时间驱动的,因此定时任务解决的就是这种业务场景。

♨️技术选型

快速实现的定时任务

  • Timer:是一个定时器类,通过该类可以为指定的定时任务进行配置。TimerTask类是一个定时任务类,该类实现了Runnable接口,缺点异常未检查会中止线程
  • ScheduledExecutorService:相对延迟或者周期作为定时任务调度,缺点没有绝对的日期或者时间
  • Spring Task:配置简单功能较多,如果系统使用单机的话可以优先考虑spring定时器

复杂业务场景(分布式)

  • Quartz: Java事实上的定时任务标准。但Quartz关注点在于定时任务而非数据,并无一套根据数据处理而定制化的流程。虽然Quartz可以基于数据库实现作业的高可用,但缺少分布式并行调度的功能
  • TBSchedule:阿里早期开源的分布式任务调度系统。代码略陈旧,使用timer而非线程池执行任务调度。众所周知,timer在处理异常状况时是有缺陷的。而且TBSchedule作业类型较为单一,只能是获取/处理数据一种模式。还有就是文档缺失比较严重
  • Elastic-job:当当开发的弹性分布式任务调度系统,功能丰富强大,采用Zookeeper实现分布式协调,实现任务高可用以及分片,目前是版本2.15,并且可以支持云开发。
  • Saturn:是唯品会自主研发的分布式的定时任务的调度平台,基于当当的elastic-job 版本1开发,并且可以很好的部署到docker容器上。
  • Xxl-job: 是大众点评员工徐雪里于2015年发布的分布式任务调度平台,是一个轻量级分布式任务调度框架,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。

因此,SpringTask适用于简单、快速实现的定时任务场景,Elastic-job和Xxl-job适用于复杂、分布式的定时任务场景。当然Spring Task也可以实现分布式:

  1. 可以选择代码分离进行单台部署,
  2. 可以选择redis分布式锁,让一台服务拿到相应的key之后去执行,
  3. 使用zookeeper分布式锁获取单个锁.

🚀快速开始

1.创建SpringBoot项目

Spring定时任务是Spring Boot内置组件

pom.xml

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-configuration-processor</artifactId>
    <optional>true</optional>
</dependency>
<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <optional>true</optional>
</dependency>

2.开启定时任务

在 application 启动类中使用 @EnableScheduling 注解开启定时任务,会自动扫描,相当于一个开关,把这个开关开完之后,那么只要在相应的任务类中做相应的任务,那么就会被 spring boot 容器扫描到,扫描到后,根据任务定义的时间会自动运行。

SpringbootScheduletaskApplication.java

@SpringBootApplication
@EnableScheduling
public class SpringbootScheduletaskApplication {

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

}

3.编写定时任务配置类

ScheduleTaskConfig.java

/**
 * @Auther deepinsea
 * @Date 2022/3/14
 * 定时任务配置类
 */
@Component
public class ScheduleTaskConfig {

    // 每隔5s执行一次
    @Scheduled(cron = "0/5 * * * * ?")
    public void printSay() {
        System.out.println("每隔5s执行一次:" + new Date());
    }
}

4.测试使用

点"▶"运行项目

2022-04-10 23:32:43.643  INFO 57872 --- [           main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 868 ms
2022-04-10 23:32:43.935  INFO 57872 --- [           main] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8080 (http) with context path ''
2022-04-10 23:32:43.944  INFO 57872 --- [           main] c.d.s.SpringbootScheduletaskApplication  : Started SpringbootScheduletaskApplication in 1.594 seconds (JVM running for 3.296)
每隔5s执行一次:Sun Apr 10 23:32:45 CST 2022
每隔5s执行一次:Sun Apr 10 23:32:50 CST 2022
每隔5s执行一次:Sun Apr 10 23:32:55 CST 2022
每隔5s执行一次:Sun Apr 10 23:33:00 CST 2022

Process finished with exit code 130

测试成功!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值