0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何使用Spring scheduling task简化定时任务功能的实现?

冬至子 来源:天码营 作者:Cliff 2023-05-22 16:48 次阅读

很多时候,我们有这么一个需求,需要在每天的某个固定时间或者每隔一段时间让应用去执行某一个任务。为了实现这个需求,通常我们会通过多线程来实现这个功能,但是这样我们需要自己做一些比较麻烦的工作。接下来,让我们看看如何使用Spring scheduling task简化定时任务功能的实现。

添加maven依赖

为了方便展示,我们使用Spring Boot来简化我们的Spring配置。因为我们使用的是Spring自带的Scheduling,因此我们只需要引入最进本的spring-boot-starter即可。

<parent>
    <groupId>org.springframework.boot<span class="hljs-name"groupId>
    <artifactId>spring-boot-starter-parent<span class="hljs-name"artifactId>
    <version>1.2.5.RELEASE<span class="hljs-name"version>
<span class="hljs-name"parent>

<properties>
    <java.version>1.8<span class="hljs-name"java.version>
<span class="hljs-name"properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot<span class="hljs-name"groupId>
        <artifactId>spring-boot-starter<span class="hljs-name"artifactId>
    <span class="hljs-name"dependency>
<span class="hljs-name"dependencies>

注意,Spring boot需要JDK8的编译环境。

创建Scheduled Task

让我们创建一个ScheduleTask来实现我们的需求:

@Component
public class ScheduledTask {

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    private Integer count0 = 1;
    private Integer count1 = 1;
    private Integer count2 = 1;

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() throws InterruptedException {
        System.out.println(String.format("---第%s次执行,当前时间为:%s", count0++, dateFormat.format(new Date())));
    }

    @Scheduled(fixedDelay = 5000)
    public void reportCurrentTimeAfterSleep() throws InterruptedException {
        System.out.println(String.format("===第%s次执行,当前时间为:%s", count1++, dateFormat.format(new Date())));
    }

    @Scheduled(cron = "*/5 * * * * *")
    public void reportCurrentTimeCron() throws InterruptedException {
        System.out.println(String.format("+++第%s次执行,当前时间为:%s", count2++, dateFormat.format(new Date())));
    }

}

可以看到,我们在我们真正需要执行的方法上添加了@Scheduled标注,表示这个方法是需要定时执行的。

@Scheduled标注中,我们使用了三种方式来实现了同一个功能:每隔5秒钟记录一次当前的时间:

fixedRate = 5000表示每隔5000ms,Spring scheduling会调用一次该方法,不论该方法的执行时间是多少

fixedDelay = 5000表示当方法执行完毕5000ms后,Spring scheduling会再次调用该方法

cron = "*/5 * * * * * *"提供了一种通用的定时任务表达式,这里表示每隔5秒执行一次。

配置Scheduling

接下来我们通过Spring boot来配置一个最简单的Spring web应用,我们只需要一个带有main方法的类即可:

[]()

@SpringBootApplication
@EnableScheduling
public class App {

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

}

我们先来看看class上的标注:

@SpringBootApplication 实际上是了以下三个标注的集合:

@Configuration 告诉Spring这是一个配置类,里面的所有标注了@Bean的方法的返回值将被注册为一个Bean

@EnableAutoConfiguration 告诉Spring基于class path的设置、其他bean以及其他设置来为应用添加各种Bean

@ComponentScan 告诉Spring扫描Class path下所有类来生成相应的Bean

@EnableScheduling 告诉Spring创建一个task executor,如果我们没有这个标注,所有@Scheduled标注都不会执行

通过以上标注,我们完成了schedule的基本配置。最后,我们添加main方法来启动一个Spring boot应用即可。

测试

在根目录下执行命令:mvn spring-boot:run,我们可以看到:

图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Web服务器
    +关注

    关注

    0

    文章

    137

    浏览量

    24231
  • JDK
    JDK
    +关注

    关注

    0

    文章

    77

    浏览量

    16489
收藏 人收藏

    评论

    相关推荐

    关于stm32系统定时任务的问题

    在用stm32做一个飞控程序时。需要用到上面这种系统循环定时任务,有一个问题:在System_Task_Loop函数里面,有1ms 、2ms、5ms的循环任务,但是他的这些定时是怎么得
    发表于 10-10 23:43

    Linux系统定时任务Crond

    会定期(默认每分钟检查一次)检查系统中是否有要执行的任务工作,如果有,便会根据其预先设定的定时任务规则自动执行该定时任务工作,这个crond定时任务服务就相当于我们平时早起使用的闹钟一
    发表于 07-05 06:22

    linux的循环定时任务

    linux循环定时任务
    发表于 05-20 14:59

    定时任务的发展史是怎么样的

    定时任务是互联网行业里最常用的服务之一,本文给大家介绍定时任务在我司的发展历程。 linux系统中一般使用crontab命令来实现,在Java世界里,使用最广泛的就是quartz
    发表于 07-18 17:38 0次下载
    <b class='flag-5'>定时任务</b>的发展史是怎么样的

    SpringBoot如何实现动态增删启停定时任务

    spring boot项目中,可以通过 @EnableScheduling 注解和@Scheduled注解实现定时任务,也可以通过SchedulingConfigurer接口来实现
    的头像 发表于 09-24 09:49 2597次阅读
    SpringBoot如何<b class='flag-5'>实现</b>动态增删启停<b class='flag-5'>定时任务</b>

    Python定时任务实现方式

    在日常工作中,我们常常会用到需要周期性执行的任务,一种方式是采用 Linux 系统自带的 crond 结合命令行实现。另外一种方式是直接使用Python。接下来整理的是常见的Python定时任务
    的头像 发表于 10-08 15:20 3226次阅读

    说说Spring定时任务如何大规模企业级运用

    定时任务是业务应用开发中非常普遍存在的场景(如:每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报表等等),解决方案很多,Spring 框架提供了一种通过注解来配置定时任务的解决方案,接入非常的
    的头像 发表于 11-04 09:36 508次阅读

    解析Golang定时任务库gron设计和原理

    正巧,最近看到了 gron 这个开源项目,它是用 Golang 实现一个并发安全的定时任务库。实现非常简单精巧,代码量也不多。今天我们就来一起结合源码看一下,怎样基于 Golang 的能力做出来一个【
    的头像 发表于 12-15 13:57 948次阅读

    求一种SpringBoot定时任务动态管理通用解决方案

    SpringBoot的定时任务的加强工具,实现对SpringBoot原生的定时任务进行动态管理,完全兼容原生@Scheduled注解,无需对原本的定时任务进行修改
    的头像 发表于 02-03 09:49 551次阅读

    SpringBoot如何实现定时任务(下)

    SpringBoot创建定时任务的方式很简单,主要有两种方式:一、基于注解的方式(@Scheduled)二、数据库动态配置。实际开发中,第一种需要在代码中写死表达式,如果修改起来,又得重启会显得很麻烦;所以我们往往会采取第二种方式,可以直接从数据库中读取定时任务的指定执行
    的头像 发表于 04-07 14:51 1036次阅读
    SpringBoot如何<b class='flag-5'>实现</b><b class='flag-5'>定时任务</b>(下)

    SpringBoot如何实现定时任务(上)

    SpringBoot创建定时任务的方式很简单,主要有两种方式:一、基于注解的方式(@Scheduled)二、数据库动态配置。实际开发中,第一种需要在代码中写死表达式,如果修改起来,又得重启会显得很麻烦;所以我们往往会采取第二种方式,可以直接从数据库中读取定时任务的指定执行
    的头像 发表于 04-07 14:51 1027次阅读
    SpringBoot如何<b class='flag-5'>实现</b><b class='flag-5'>定时任务</b>(上)

    Spring Boot中整合两种定时任务的方法

    Spring + SpringMVC 环境中,一般来说,要实现定时任务,我们有两中方案,一种是使用 Spring 自带的定时任务处理器
    的头像 发表于 04-07 14:55 1243次阅读
    <b class='flag-5'>Spring</b> Boot中整合两种<b class='flag-5'>定时任务</b>的方法

    Spring Boot中如何使用定时任务

    本文介绍在 Spring Boot 中如何使用定时任务,使用非常简单,就不做过多说明了。
    的头像 发表于 04-12 10:56 782次阅读

    如何动态添加修改删除定时任务

    如何动态添加修改删除定时任务?那么我们一起看看具体怎么实现,先看下本节大纲: (1)思路说明; (2)代码解析; (3)修改定时任务执行周期特别说明;
    的头像 发表于 04-12 11:06 869次阅读

    python定时任务实践

    由于程序需求,监测配置变化需要设置定时任务,每分钟执行一次,对任务持久化要求不高,不需要时可以关闭定时任务
    的头像 发表于 05-20 17:53 784次阅读
    python<b class='flag-5'>定时任务</b>实践