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

这篇具有很好参考价值的文章主要介绍了Spring6.x对调度和异步执行的注解支持。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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

1 启用Scheduling注解

要启用 @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 接口。有关完整详细信息,请参阅 SchedulingConfigurerAsyncConfigurer 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://blog.csdn.net/LYM0721/article/details/89499588

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

本文由博客一文多发平台 OpenWrite 发布!文章来源地址https://www.toymoban.com/news/detail-747189.html

到了这里,关于Spring6.x对调度和异步执行的注解支持的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 造个轮子-任务调度执行小框架-任务清单执行器实现

    okey,上一篇文章我们提到了,如何实现它的一个清单的一个代理。这里的话我们来捋一捋我们的这个执行流程是啥: 所以的话,我们的我们这里今天要做的是这个执行器的一个执行。当然这里的话,我们也是分两个部分,因为这个执行器的话,是分两个部分的,一个是正常的

    2024年02月13日
    浏览(36)
  • 【面试问题】事务中执行了异步任务分发数据,由于事务未提交,导致异步任务无法执行

    客户数据分发CRMS系统的时候异常,分发任务强依赖于事务内有没有提交,异常由事务未及时提交导致异步任务无法及时查到数据,现将异步任务调整为事务提交后处理 添加事务同步管理器,声明异步是在事务提交后执行

    2024年02月13日
    浏览(28)
  • 造个轮子-任务调度执行小框架-任务清单解析实现

    okey~每日编码一坤时,昨天的话我们已经实现了这个框架的IOC容器。通过这个IOC容器,我们就可以非常轻松地进行后续的操作,于是,我们接着这个工作,去完成这个任务清单的解析。 昨天的话,阐述了一下这个框架解决了哪些问题,那么接下来,是如何使用这个家伙。以及

    2024年02月13日
    浏览(33)
  • SpringBoot异步方法支持注解@Async应用

    合理使用异步方法可以有效的提高执行效率 同步执行(同在一个线程中): 异步执行(开启额外线程来执行): 在SpringBoot中并不需要我们自己去创建维护线程或者线程池来异步的执行方法, SpringBoot已经提供了异步方法支持注解. service层: controller层: 测试结果: 我们可以感受到接口

    2024年02月11日
    浏览(36)
  • 测试平台——异步执行任务

    2023年08月21日
    浏览(32)
  • C++语言Qt实现 实时任务调度仿真软件 任务参数可配置和随机生成支持多核调度

    我遇到个需求: 目标: 开发一个实时任务调度仿真软件,我们在学习操作系统这门课时候,经常需要观察任务动态调度情况,来更好的直观学习操作系统任务调度过程和调度算法。 内部原理: 操作系统任务调度实际上是一个有限状态机,任务的各种状态不断的转换过程,我

    2023年04月25日
    浏览(26)
  • js中如何顺序执行异步任务

    在js中,任务可分为两种,同步任务和异步任务。 (1) 同步任务 又叫 非耗时任务 ,指的是在主线程排队执行的那些任务 只有前一个任务执行完毕,才能执行后一个任务 (2) 异步任务 又叫 耗时任务 ,异步任务由JavaScript委托给宿主环境进行执行 当异步任务执行完成后,会通知

    2024年02月09日
    浏览(31)
  • 造个轮子-任务调度执行小框架-IOC容器实现

    忙里偷闲,今天终于是把概率论这块骨头干下来了。所以的话,留了点时间,把整个项目的结构和基本的功能给实现以下。通过昨天的一个功能的一个设计,我想应该可以明白我想干啥吧。这里的话,重复一下,那就是俺们要搞一个任务执行框架。 这个框架到底有啥用?举个

    2024年02月13日
    浏览(30)
  • linux-crontab每分钟定时执行/定时任务调度

    本文讲解linux上如何调用定时任务,如每分钟打印日志,每日24点执行日志切割脚本等等。 在Linux系统中,crontab命令是一个用于执行定时任务的命令, crond(crontab)是系统默认自带的定时服务 。我们可以通过编辑crontab文件来设置定时任务,使系统可以自动按照设定的时间和频率

    2024年02月06日
    浏览(45)
  • XXL-JOB 任务调度中心 后台任意命令执行漏洞

    在日常开发中,经常会用定时任务执行某些不紧急又非常重要的事情,例如批量结算,计算当日的订单量,当日的成本收入等。当存在大量定时任务的时候,任务的管理也会成为一个比较头痛的问题。xxl-job,就是一个比较成熟的分布式任务调度平台。XXL-JOB 任务调度中心系统

    2024年02月08日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包