专栏首页java干货Spring系列十三:Spring @Scheduled注解

Spring系列十三:Spring @Scheduled注解

唯将终夜长开眼,报答平生未展眉。

概述

Spring使用@Scheduled注解为基于cron表达式的任务调度和异步方法执行提供了出色的支持。可以将@Scheduled注解与触发器元数据一起添加到方法中。

在本文中,我们将展示以4种不同方式使用@Scheduled功能的方法。

@Scheduled注解概述

@Scheduled注解用于任务调度。触发器信息需要与此注解一起提供。可以使用属性fixedDelay/fixedRate/cron来提供触发信息。

  1. fixedRate使Spring定期运行任务,即使最后一次调用可能仍在运行。
  2. fixedDelay专门控制最后一次执行结束时的下一次执行时间。
  3. cron是源自Unix cron实用程序的功能,根据你的要求有多种选择。
@Scheduled(fixedDelay =30000)
public void demoServiceMethod () {... }
 
@Scheduled(fixedRate=30000)
public void demoServiceMethod () {... }
 
@Scheduled(cron="0 0 * * * *")
public void demoServiceMethod () {... }

启用@Scheduled注解

要在Spring应用程序中使用@Scheduled,必须首先在applicationConfig.xml文件中定义以下xml命名空间和模式位置定义。还添加task:annotation-driven以启用基于注释的任务计划。

xmlns:task="http://www.springframework.org/schema/task"
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.0.xsd
 
<task:annotation-driven>

上面的添加是必要的,因为我们将使用基于注解的配置。

使用@Scheduled注解

下一步是在类中创建一个类和一个方法,如下所示:

public class DemoService
{
    @Scheduled(cron="*/5 * * * * ?")
    public void demoServiceMethod()
    {
        System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
    }
}
  1. 使用@Scheduled注解将使Spring容器理解该注解下面的方法将作为作业运行。
  2. 请记住,用@Scheduled注解的方法不应将参数传递给它们。
  3. 他们也不应返回任何值。
  4. 如果要在@Scheduled方法中使用外部对象,则应使用自动装配将它们注入到DemoService类中,而不要将其作为参数传递给@Scheduled方法。

使用@Scheduled注解中的fixedDelay属性

在此方法中,fixedDelay属性与@Scheduled注解一起使用。也可以使用fixedRate

示例类如下所示:

package cn.howtodoinjava.service;
 
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
 
public class DemoServiceBasicUsageFixedDelay
{
    @Scheduled(fixedDelay = 5000)
    //@Scheduled(fixedRate = 5000)  //Or use this
    public void demoServiceMethod()
    {
        System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
    }
}

应用程序配置如下所示:

< ?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
 
    <task:annotation-driven />
 
    <bean id="demoServiceBasicUsageFixedDelay" class="cn.howtodoinjava.service.DemoServiceBasicUsageFixedDelay"></bean>
 
</beans>

使用属性文件的cron表达式

在此方法中,cron属性与@Scheduled注解一起使用。这个属性的值必须是一个cron表达式,但是,这个cron表达式将在一个属性文件中定义,并且相关属性的键将在@Scheduled注解中使用。

这将从源代码中解耦cron表达式,从而使更改变得容易。

package cn.howtodoinjava.service;
 
import java.util.Date;
import org.springframework.scheduling.annotation.Scheduled;
 
public class DemoServicePropertiesExample {
 
    @Scheduled(cron = "${cron.expression}")
    public void demoServiceMethod()
    {
        System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
    }
 
}

应用程序配置如下所示:

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
 
    <task:annotation-driven />
 
    <util:properties id="applicationProps" location="application.properties" />
 
    <context:property-placeholder properties-ref="applicationProps" />
 
    <bean id="demoServicePropertiesExample" class="cn.howtodoinjava.service.DemoServicePropertiesExample"></bean>
 
</beans>

application.properties 如下:

corn.expression = */5 * * * * ?

在上下文配置中使用cron表达式

该方法在属性文件中配置cron表达式,在配置文件中使用cron表达式的属性键配置作业调度。主要的变化是您不需要在任何方法上使用@Scheduled注解。方法配置也在应用程序配置文件中完成。

示例类如下所示:

package cn.howtodoinjava.service;
 
import java.util.Date;
 
public class DemoServiceXmlConfig
{
    public void demoServiceMethod()
    {
        System.out.println("Method executed at every 5 seconds. Current time is :: "+ new Date());
    }
 
}

应用程序配置如下所示:

<?xml  version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:task="http://www.springframework.org/schema/task"
 xmlns:util="http://www.springframework.org/schema/util"
 xmlns:context="http://www.springframework.org/schema/context"
 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
        http://www.springframework.org/schema/context/ http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/util/ http://www.springframework.org/schema/util/spring-util.xsd
        http://www.springframework.org/schema/task http://www.springframework.org/schema/task/spring-task-3.0.xsd">
 
    <task:annotation-driven />
 
    <util:properties id="applicationProps" location="application.properties" />
 
    <context:property-placeholder properties-ref="applicationProps" />
 
    <bean id="demoServiceXmlConfig" class="cn.howtodoinjava.service.DemoServiceXmlConfig" />
 
    <task:scheduled-tasks>
        <task:scheduled ref="demoServiceXmlConfig" method="demoServiceMethod" cron="#{applicationProps['cron.expression']}"></task:scheduled>
    </task:scheduled-tasks>
 
</beans>

application.properties 如下:

corn.expression = */5 * * * * ?

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spring系列十二:Spring @Required注解

    在生产级应用程序中,IoC容器中可能声明了成百上千个bean,它们之间的依赖关系通常非常复杂。setter注入的一个缺点是,很难检查是否设置了所有必需的属性。使...

    java干货
  • Spring系列十一:Spring @Configuration注解

    Spring @Configuration注解有助于基于Spring注解的自动装配。@Configuration注解指示一个类声明了一个或多个@Bean方法,S...

    java干货
  • spring-boot-route(二十)Spring Task实现简单定时任务

    Spring Task是Spring 3.0自带的定时任务,可以将它看作成一个轻量级的Quartz,功能虽然没有Quartz那样强大,但是使用起来非常简单,无需...

    Java旅途
  • 分布式系统中的定时任务全解(一)

    在网站系统里面定时任务是一个重要和不可缺的角色,很多地方需要使用定时执行一项任务。比如,订单系统的接单超时、支付超时,结算系统的定时结算、奖励计算,第三方的认证...

    九州暮云
  • Spring 定时任务框架详解(1)——快速入门

    由此可见,基于Spring的定时任务机制,可以十分方便地执行定时任务。下一节将结合源码,详细分析Spring的定时任务机制。

    张申傲
  • 「Spring Boot 2.4 新特性」新增通用宏简化Cron表达式

    说起 cron 表达式大家一定不陌生,我们常用来作为定时任务执行策略规则。 在 Spring Boot 框架中 cron 表达式主要配合 @Scheduled ...

    冷冷
  • SpringBoot系列之使用Spring Task实现定时任务

    定时任务是企业开发中很常用的,比如定时推送一些接口数据,在java中实现定时任务的方法有Spring Task、Quartz等等框架,也有JDK自带的Sched...

    SmileNicky
  • springboot(11)-调度

    调度是非常常用的功能,当前springboot也对调度提供了很好的支持,springboot可以使用自带的调度功能完成定时任务,也可以集成第三方调度构件...

    叔牙
  • SpringBoot入门建站全系列(十五)内置定时任务及Quartz定时任务使用

    2.ScheduledExecutorService,线程池版的TimerTask。

    品茗IT
  • Spring中定时器实现

    在Spring 中使用Quartz,本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻量级的Quartz,而且使用...

    Java团长
  • Spring 定时任务框架详解(3)——源码分析

    如前文所述,可通过@EnableScheduling注解开启定时任务调度,所以我们从@EnableScheduling注解开始:

    张申傲
  • SpringBoot入门建站全系列(十五)内置定时任务及Quartz定时任务使用

    2.ScheduledExecutorService,线程池版的TimerTask。

    品茗IT
  • Spring Boot 执行定时任务

    “ Spring Boot中可以使用注解实现定时任务,十分方便。今天的文章我们首先讲一下个人的项目,然后在文章后面我们将定时任务与线程池结合起来实现每天的个人支...

    每天学Java
  • springboot深入浅出系列(16章97节)

    本书为spring boot 深入浅出系列视频教程的文档。 spring boot 深入浅出系列课程(16章97节)

    字母哥博客
  • spring如何设置定时任务详解(@Scheduled)

    spring定时任务设置有两种方式,注解和xml配置。推荐使用注解,在本文章也主要介绍注解方式配置

    洋仔聊编程
  • 玩转SpringBoot之定时任务详解

    基于注解@Scheduled默认为单线程,开启多个任务时,任务的执行时机会受上一个任务执行时间的影响。

    Java编程指南
  • Spring Framework 5.3.0正式发布,在云原生路上继续发力

    北京时间2020-10-27,Spring Framework 5.3.0版本正式发布。说明:Spring Framework 5.2.0.RELEASE的发布...

    YourBatman
  • 谨慎使用SpringBoot中的@Scheduled注解

    在最近的项目中,碰到了@Scheduled注解失效的问题,分析原因后,使用@Scheduled注解做定时任务需求需要格外小心,避免踩入不必要的坑。

    IT大咖说
  • Spring整合Schedule定时任务详解

    所以,这里还是先讲第三个吧,前两个跟Spring没关系,这里不讲,quartz配置麻烦,后面篇幅再说。

    品茗IT

扫码关注云+社区

领取腾讯云代金券