Spring Task定时任务使用

 更新时间:2024年08月02日 09:29:40   作者:Gambler_Tu  
这篇文章主要介绍了Spring Task定时任务使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Spring Task 定时任务

在项目开发中,经常需要定时任务来帮助我们来做一些内容,比如定时派息、跑批对账、业务监控等。

实现定时任务有 3 种方式:

  • java 自带的 API:java.util.Timer 类和 java.util.TimerTask 类;
  • Quartz 框架:开源 功能强大 使用起来稍显复杂;
  • Spring 3.0 以后自带了 task 调度工具,也称 Spring Task,它比 Quartz 更加的简单方便。

pom 包配置

pom 包里面只需要引入 SpringBoot Starter 包即可,SpringBoot Starter 包中已经内置了定时的方法。

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

启动类开启定时

在启动类上面加上 @EnableScheduling 即可开启定时:

@SpringBootApplication
@EnableScheduling
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

创建定时任务实现类

使用 SpringBoot 自带的定时非常的简单,只需要在方法上面添加 @Scheduled 注解即可。

定时任务 1:

@Component
public class SchedulerTask {
    private static final Logger log = LoggerFactory.getLogger(SchedulerTask.class);
    private int count = 0;

    @Scheduled(cron="*/6 * * * * ?")
    private void process() {
        log.info("{}", "this is scheduler task running " + (count++));
    }
}

设置 process() 每隔六秒执行一次,并统计执行的次数。

我们还有另外的一种方案来设置,固定时间周期执行方法。

定时任务 2:

@Component
public class Scheduler2Task {
    private static final Logger log = LoggerFactory.getLogger(Scheduler2Task.class);
    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 6000)
    public void reportCurrentTime() {
        log.info("{}", "现在时间:" + dateFormat.format(new Date()));
    }
}

启动项目之后,就会在控制台看到打印的结果。

结果如下:

INFO [   scheduling-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:12:02
INFO [   scheduling-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 0
INFO [   scheduling-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:12:08
INFO [   scheduling-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 1
INFO [   scheduling-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:12:14
INFO [   scheduling-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 2

说明两个方法都按照固定 6 秒的频率来执行。

参数说明

@Scheduled 参数可以接受两种定时的设置

  • 一种是我们常用的 cron="*/6 * * * * ?"
  • 一种是 fixedRate = 6000

两种都可表示固定周期执行定时任务。

fixedRate 说明:

  • @Scheduled(fixedRate = 6000) : 上一次开始执行时间点之后 6 秒再执行。
  • @Scheduled(fixedDelay = 6000) : 上一次执行完毕时间点之后 6 秒再执行。
  • @Scheduled(initialDelay=1000, fixedRate=6000) : 第一次延迟 1 秒后执行,之后按 fixedRate 的规则每 6 秒执行一次。

cron 说明:

  • 用来配置定时任务的时间表达式,通常用于在Unix/Linux系统中设置定时任务。
  • 在Java应用程序中,Cron表达式也被广泛使用,比如在Quartz调度框架中用来配置定时任务的触发时间。
  • Cron表达式由7个字段组成,分别表示秒、分钟、小时、日期、月份、星期和年(可选)。
  • 每个字段可以包含多个取值,以逗号分隔,或者可以使用通配符和范围来表示时间。

以下是Cron表达式的基本格式:

plaintext 秒 分 时 日 月 星期 年 其中,各字段的取值范围如下:

  • 秒(0-59)、分钟(0-59)、小时(0-23)、日期(1-31)、月份(1-12或者 JAN-DEC) 星期(0-7或者 SUN-SAT,0和7都代表星期日)、年(可选,留空表示每年)。

以下是一些常见的Cron表达式示例:

  • 0 0 12 * * ?:每天中午12点触发
  • 0 0/5 * * * ?:每隔5分钟触发
  • 0 0 8-10 * * ?:每天上午8点至10点之间每小时触发
  • 0 0 6,18 * * ?:每天早上6点和晚上6点触发
  • 0 0 9 ? * MON-FRI:周一至周五的早上9点触发

并行任务

了解:

之前的的定时任务都是串行执行的。所谓串行执行指的是只由一个线程来执行任务。

除了这种方式 Spring Task 还支持并行执行任务,即由多个线程来执行不同的任务。

要实现这样的功能,你需要去进行额外的配置:

@Configuration
@EnableScheduling
public class TimingTaskConfig implements SchedulingConfigurer, AsyncConfigurer {

    // 线程池线程数量
    private static final int corePoolSize = 5;

    @Bean
    public ThreadPoolTaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.initialize(); // 初始化线程池
        scheduler.setPoolSize(corePoolSize); // 线程池容量
        return scheduler;
    }

    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
        taskRegistrar.setTaskScheduler(taskScheduler());
    }

    @Override
    public Executor getAsyncExecutor() {
        return taskScheduler();
    }

    @Override
    public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
        return null;
    }
}

注意,这时 @EnableScheduling 注解标注在了这个配置类上,因此,Spring Boot 的入口类上就不再需要标注它了。(当然,你硬要把它标注在入口类上其实也可以)。

其它的相关代码无需修改,运行项目你会看到类似如下的日志输出:

INFO [taskScheduler-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:08:57
INFO [taskScheduler-1] com.example.timingtask.SchedulerTask     : this is scheduler task running 0
INFO [taskScheduler-2] com.example.timingtask.Scheduler2Task    : 现在时间:20:09:03
INFO [taskScheduler-3] com.example.timingtask.SchedulerTask     : this is scheduler task running 1
INFO [taskScheduler-1] com.example.timingtask.Scheduler2Task    : 现在时间:20:09:09
INFO [taskScheduler-4] com.example.timingtask.SchedulerTask     : this is scheduler task running 2

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Spring详细解读事务管理

    Spring详细解读事务管理

    Spring事务的本质就是对数据库事务的支持,没有数据库事务,Spring是无法提供事务功能的。Spring只提供统一的事务管理接口,具体实现都是由数据库自己实现的,Spring会在事务开始时,根据当前设置的隔离级别,调整数据库的隔离级别,由此保持一致
    2022-04-04
  • springboot集成微软teams的实例代码

    springboot集成微软teams的实例代码

    Microsoft Teams 是一款基于聊天的智能团队协作工具,可以同步进行文档共享,并为成员提供包括语音、视频会议在内的即时通讯工具,今天给大家介绍springboot集成微软teams的示例代码,感兴趣的朋友一起看看吧
    2022-01-01
  • SpringBoot使用@valid进行参数校验的流程步骤

    SpringBoot使用@valid进行参数校验的流程步骤

    SpringBoot 提供了一种方便的方式来进行参数校验:使用 Hibernate Validator,Spring Boot 提供了一种方便的方式来进行参数校验:使用 Hibernate Validator,所以本文给大家介绍了SpringBoot使用@valid进行参数校验的流程步骤,需要的朋友可以参考下
    2023-09-09
  • SSM框架搭建图文教程(推荐)

    SSM框架搭建图文教程(推荐)

    下面小编就为大家带来一篇SSM框架搭建图文教程(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • 详解SpringBoot+Lucene案例介绍

    详解SpringBoot+Lucene案例介绍

    这篇文章主要介绍了详解SpringBoot+Lucene案例介绍,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-06-06
  • datax-web在windows环境idea中模块化打包部署操作步骤

    datax-web在windows环境idea中模块化打包部署操作步骤

    这篇文章主要介绍了datax-web在windows环境idea中模块化打包部署操作步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-05-05
  • 聊聊Java 中的线程中断

    聊聊Java 中的线程中断

    这篇文章主要介绍了Java 中的线程中断的相关资料,帮助大家更好的理解和使用Java,感兴趣的朋友可以了解下
    2020-11-11
  • Java 中的io模型详解

    Java 中的io模型详解

    这篇文章主要介绍了Java 中io模型的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-04-04
  • Spring事件监听基本原理与使用详解

    Spring事件监听基本原理与使用详解

    这篇文章主要介绍了Spring事件监听基本原理与使用详解,Spring的事件监听机制和发布订阅机制是很相似的:发布了一个事件后,监听该类型事件的所有监听器会触发相应的处理逻辑,需要的朋友可以参考下
    2024-01-01
  • Java面向对象基础知识之委托和lambda

    Java面向对象基础知识之委托和lambda

    这篇文章主要介绍了Java面向对象的之委托和 lambda,文中有非常详细的代码示例,对正在学习java基础的小伙伴们有很好的帮助,需要的朋友可以参考下
    2021-11-11

最新评论