Spring6.x对调度和异步执行的注解支持示例详解

 更新时间:2023年11月24日 09:15:30   作者:JavaEdge  
这篇文章主要为大家介绍了Spring6.x对调度和异步执行的注解支持示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

1 启用Scheduling注解

Spring为任务调度和异步方法执行提供注解支持。

要启用 @Scheduled 和 @Async ,在 @Configuration 类(或者在启动类)添加 @EnableScheduling 和 @EnableAsync,如下:

@Configuration
@EnableAsync
@EnableScheduling
public class AppConfig {

}
@SpringBootApplication(exclude = {
        DataSourceAutoConfiguration.class,
})
@EnableScheduling
public class RoadSyncApplication {

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

你可以为你的应用程序选择相关的注解。例如,如果你只需要支持 @Scheduled,可以省略 @EnableAsync。对于更细粒度的控制,你还可以分别实现 SchedulingConfigurer 接口和 AsyncConfigurer 接口。有关完整详细信息,请参阅 SchedulingConfigurer 和 AsyncConfigurer javadoc。

默认处理 @Async 注解的建议模式是 proxy,它仅允许通过代理拦截调用。使用这种方式无法拦截同一类中的本地调用。 对于更高级的拦截模式,请考虑切换到 aspectj 模式与编译时织入或加载时织入结合使用。

2 @Scheduled 注解

可将 @Scheduled 注解以及触发元数据添加到方法中。

2.1 fixedDelay

如下方法每5000ms执行一次,采用固定延迟,即周期从每次先前调用的【完成时间】开始测量。

@Scheduled(fixedDelay = 5000)  
public void doSomething() {
    // 定期运行的内容  
}

默认,固定延迟、固定速率和初始延迟的值将使用ms作时间单位。如想用不同时间单位,如s或min,可在 @Scheduled 配置 timeUnit 属性:

@Scheduled(fixedDelay = 5, timeUnit = TimeUnit.SECONDS)
public void doSomething() {
}

2.2 fixedRate

如需固定速率执行,使用 fixedRate 属性。下面的方法每五秒(从每次【调用的开始时间】间隔测量)执行一次:

@Scheduled(fixedRate = 5, timeUnit = TimeUnit.SECONDS)  
public void doSomething() {

}

固定延迟、固定速率的任务,可通过指示等待的时间量来指定初始延迟,然后再执行方法的第一次调用:

@Scheduled(initialDelay=1000, fixedRate=5000)  
public void doSomething() {
    // 定期运行的内容
}

2.3 一次性任务

可只指定通过指示等待执行方法的时间量的初始延迟:

@Scheduled(initialDelay=1000)
public void doSomething() {
    // 只运行一次
}

若简单的定期计划不够表达力,可用 cron 表达式:

@Scheduled(cron="*/5 * * * * MON-FRI")  
public void doSomething() {
    // 仅在工作日运行的内容 
}

还可使用 zone 属性指定解析 cron 表达式的时区。

要计划的方法须有 void 返回值,且不接受任何参数。如果方法需要与应用程序上下文中的其他对象交互,那么这些对象通常已经通过依赖注入。

@Scheduled 是可重复注解。如在同一方法上找到几个 scheduled 声明,每个声明都将独立处理,为每个声明触发单独的触发器。因此,这样的共定位计划可并行重叠并立即连续执行多次。请确保你指定的 cron 表达式等不会意外重叠。

Spring Framework 4.3 开始,支持任何范围的 bean 上的 @Scheduled 方法。确保在运行时不初始化同一 @Scheduled 注解类的多个实例,除非你确实希望调度回调到每个这样的实例。

确保不要在使用 @Scheduled 注解并作为常规 Spring bean 注册到容器中的 bean 类上使用 @Configurable。否则,你将获得双重初始化(一次通过容器,一次通过 @Configurable 方面),其结果是每个 @Scheduled 方法被调用两次。

FAQ

问题

生产用@Scheduled注解写定时任务,5min执行一次:

@Scheduled(cron = "0 0/5 * * * ?")
public void MyTimerJobSchedule() throws Exception {
  //省略具体业务逻辑
  System.out.println("五分钟执行一次");
}

过几天,领导通知说有问题,一查日志,发现是定时任务问题。本来应该是5min跑一次,结果日志发现,每天0点-3点正常,3-10点没执行;一直到10-11点之间才继续跑。

原因

发现可能是定时任务单线程模式导致任务阻塞。

继续分析日志,发现该定时任务的线程号是[Scheduling-1],除了执行自身的任务,还打印了其它定时任务的输出语句。

每天3点前,[Scheduling-1]线程在执行本人写的5min一次的定时任务,3点后,[Scheduling-1]线程会执行另一个比较耗时的定时任务,直到10点后,[Scheduling-1]线程才重新执行5min一次的定时任务。

看来,确实是由于@Scheduled定时任务默认使用单线程模式导致:一旦有一个定时任务比较耗时,就会影响到其它定时任务按时执行。

解决方法

在定时任务加@Async注解,并在启动类增加@EnableAsync注解,使用多线程模式执行定时任务。

参考网址 https://www.jb51.net/program/3058076vb.htm

参考网址中有第二种解决方法,但是已说明不太好用,因此只用第一种解决方法就够了。

以上就是Spring6.x对调度和异步执行的注解支持示例详解的详细内容,更多关于Spring6.x调度异步执行注解的资料请关注脚本之家其它相关文章!

相关文章

  • spring cloud 之 客户端负载均衡Ribbon深入理解

    spring cloud 之 客户端负载均衡Ribbon深入理解

    下面小编就为大家带来一篇spring cloud 之 客户端负载均衡Ribbon深入理解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Spring-IOC容器-Bean管理-基于XML方式超详解

    Spring-IOC容器-Bean管理-基于XML方式超详解

    这篇文章主要介绍了Spring为IOC容器Bean的管理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2021-08-08
  • Java设计模式之单例模式详解

    Java设计模式之单例模式详解

    这篇文章主要为大家详细介绍了Java设计模式之单例模式的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-03-03
  • java 用递归获取一个目录下的所有文件路径的小例子

    java 用递归获取一个目录下的所有文件路径的小例子

    还是日志的问题,log4j生成的日志文件,自动保存到月份所在的文件夹中,需要获取到所有的日志文件,包括文件夹
    2013-09-09
  • springboot连接不上redis的三种解决办法

    springboot连接不上redis的三种解决办法

    这篇文章主要介绍了springboot连接不上redis的三种解决办法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • SpringCloud2020版本配置与环境搭建教程详解

    SpringCloud2020版本配置与环境搭建教程详解

    这篇文章主要介绍了SpringCloud2020版本配置与环境搭建教程详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-12-12
  • SpringBoot 如何编写配置文件

    SpringBoot 如何编写配置文件

    这篇文章主要介绍了SpringBoot 编写配置文件的两种方法,帮助大家更好的理解和使用springboot框架,感兴趣的朋友可以了解下
    2020-11-11
  • 用IDEA创建SpringBoot项目的详细步骤记录

    用IDEA创建SpringBoot项目的详细步骤记录

    Idea有着非常简便的Spring Boot新建过程,同时依靠pom自动下载依赖,下面这篇文章主要给大家介绍了关于用IDEA创建SpringBoot项目的详细步骤,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 使用HttpClient实现文件的上传下载方法

    使用HttpClient实现文件的上传下载方法

    下面小编就为大家带来一篇使用HttpClient实现文件的上传下载方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-12-12
  • Java中的StringUtils引入及使用示例教程

    Java中的StringUtils引入及使用示例教程

    这篇文章主要介绍了Java中的StringUtils引入及使用示例教程,本文结合示例代码给大家介绍的非常详细,介绍了java中StringUtils用法,感兴趣的朋友跟随小编一起看看吧
    2023-01-01

最新评论