springboot中@scheduled注解使用备注

SpringBoot定时任务 @Scheduled详解 这就导致了一个非常严重的分布式问题:在每一台机器上都会在同时执行定时调度任务,可能产生很多重复数据或者导致系统出现其他的业务逻辑BUG,所以在使用@Scheduled进行任务调度时,一定要配合redis的分布式锁来使用,让定时调度任务只在一台机器上执行,避免BUG出现。这个参数是最经常使用的参数,表示接收一个cron参数,cron它是一个表达式,最多接收7个参数,从左到右分别表示:秒 分 时 天 月 周 年;在使用时需要在类上添加注解@EnableScheduling,表示开启定时任务。 阅读详情

参考文章:

https://cloud.tencent.com/developer/article/1497610
https://blog.youkuaiyun.com/Rice_kil/article/details/113346174
在这里插入图片描述
关于该注解的详细属性介绍这里不做记录。也可直接参考源码注释
(部分详细内容写好后意外被某N吃了,这里只大致记录一下)

使用细节

1. 需要配合@EnableScheduling注解使用

@EnableScheduling可以加在启动类上或者配置类上

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Import(SchedulingConfiguration.class)
@Documented
public @interface EnableScheduling {

}

可以看出它没有任何属性。所以只有一个@Import在起作用,引入了SchedulingConfiguration,它的作用在xml文件中相当于:

<task:annotation-driven>
@Configuration(proxyBeanMethods = false)
@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
public class SchedulingConfiguration {

	@Bean(name = TaskManagementConfigUtils.SCHEDULED_ANNOTATION_PROCESSOR_BEAN_NAME)
	@Role(BeanDefinition.ROLE_INFRASTRUCTURE)
	public ScheduledAnnotationBeanPostProcessor scheduledAnnotationProcessor() {
		return new ScheduledAnnotationBeanPostProcessor();
	}

}

同样的,SchedulingConfiguration也非常非常的简单。只是向容器注入了一个ScheduledAnnotationBeanPostProcessor,核心逻辑所在类

2. @Scheduled主要有三种配置执行时间的方式

注解的方法必须是无参的

cron 参考cron表达式
fixedRate 表示自上一次执行开始之后多长时间执行,以毫秒为单位
fixedDelay 表示上一次执行完毕之后多长时间执行,单位也是毫秒。

后两种方式可以配置初始间隔时间initialDelay

3. 该注解允许重复注解,即一个方法可以按不同的规则作为多个任务执行。

@Repeatable(Schedules.class)
public @interface Scheduled {
}

method方法分别会在每天0点以及每周三12点执行一次

    @Scheduled(cron = "0 0 0 * * ?")
    @Scheduled(cron = "0 0 12 ? * WED")
    public void method() {
        System.err.println("hello world");
    }

4. 控制定时任务的执行顺序

默认是同步执行的,因为使用的默认线程池是单一线程的,逻辑在ScheduledTaskRegistrar类中

如果对执行顺序有要求的定时任务(前提是任务的执行是单线程串行的),有如下两种情况:

  1. 在某一时刻同时执行
    如任务A在零点初始化数据,任务B每分钟更新数据。那么在零点,必须是任务A先执行,其次才是B。但加锁只能保证线程安全,不能保证执行顺序。在这种情况下,我们可以借助redis设置获取锁的顺序,亦或标志字进行执行顺序的判断。
  2. 总是同时执行
    在任务间隔相同的情况下,一般为业务的解耦,不应操作共享资源,应当放至同一个定时任务中执行。

spring在初始化bean后,通过“postProcessAfterInitialization”拦截到所有的用到“@Scheduled”注解的方法,并解析相应的的注解参数,按顺序放入“定时任务列表”等待后续处理;之后在“定时任务列表”中统一按顺序执行相应的定时任务(注册顺序取决于类以及方法的位置前后,执行顺序还要考虑@Scheduled注解的参数配置方式,所以实际上我们并不能依赖于这种默认顺序)

5. 异步执行任务

有两种方式:

  1. 配合@Async注解
  2. 指定任务调度的线程池

6. 在Spring项目中使用@Scheduled注解,配合配置文件定义简单定时任务

在Spring的配置文件中添加定时任务相关配置:

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task.xsd">
       
    <!-- 指定定时任务的执行者为下面定义的bean,这样就不会是默认的单线程执行任务了 --> 
	  <task:annotation-driven scheduler="schedule"/>
    <!-- 相当于引入了名为schedule的ThreadPoolTaskScheduler对象 -->
    <task:scheduler id="schedule" pool-size="5"/>
</beans>

不使用注解也能定义任务,DemoTask上未使用任何注解

<?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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/task
       http://www.springframework.org/schema/task/spring-task.xsd">

		<bean id="demoTask" class="tasks.DemoTask"/>
		<!-- 不指定scheduler会默认去找名为taskScheduler的bean,那么注解形式和xml形式的定时任务使用的就不是同一个线程池 -->
		<task:annotation-driven scheduler="scheduledjob"/>
    <task:scheduler id="scheduledjob" pool-size="10"/>  
    <!-- 这里不指定schedule的话,也是会默认去找名为taskScheduler的bean-->
    <task:scheduled-tasks scheduler="scheduledjob">
        <task:scheduled ref="demoTask" method="method2" fixed-rate="2000"/>
    </task:scheduled-tasks>
</beans>

约定大于配置,如果对配置不熟悉,建议scheduler的id使用默认的taskScheduler,且要么都默认不指定scheduler,要么都指定为同一个scheduler

ThreadPoolTaskScheduler

该类为默认的定时任务执行管理者,内部包装了一个ScheduledThreadPoolExecutor线程池,默认核心线程数为1,也解释了为什么spring定时任务默认是单线程的。

	private volatile int poolSize = 1;
	@Nullable
	private ScheduledExecutorService scheduledExecutor;
	this.scheduledExecutor = createExecutor(this.poolSize, threadFactory, rejectedExecutionHandler);

7. 任务未完成

如果某个cron格式的定时任务执行未完成会出现什么现象呢?

答:此任务一直无法执行完成,无法设置下次任务执行时间,之后会导致此任务后面的所有定时任务无法继续执行,也就会出现所有的定时任务“失效”现象。

所以应用springBoot中定时任务的方法中,一定不要出现“死循环”、“http持续等待无响应”现象,否则会导致定时任务程序无法正常。

8. 任务执行时间过长

A任务执行时间过长,可能的影响,是否会影响此任务的下一次执行,以及影响其他任务B的准时执行

https://zhuanlan.zhihu.com/p/344053917

https://mp.weixin.qq.com/s?__biz=MzA4ODIyMzEwMg==&mid=2447534404&idx=1&sn=8364dd7b73c0355acef214f228269eaa&scene=21#wechat_redirect

供参考标准使用方式

@Configuration
@EnableScheduling
public class ScheduledExecutorConfig implements SchedulingConfigurer {

    private final int corePoolSize = 10;
    private final String feature = "ScheduledTask";

    @Override
    public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
        // 方式一:创建一个ScheduledThreadPoolExecutor
        scheduledTaskRegistrar.setScheduler(taskExecutor());

        // 方式二 :可议直接使用一个TaskScheduler  然后设置上poolSize等参数即可
//        ThreadPoolTaskScheduler taskScheduler = new ThreadPoolTaskScheduler();
//        taskScheduler.setPoolSize(corePoolSize);
//        taskScheduler.initialize(); // 手动初始化,同样会创建一个ScheduledThreadPoolExecutor
//        scheduledTaskRegistrar.setTaskScheduler(taskScheduler);

        // 题外话,通过这我们可以捕获到ScheduledTaskRegistrar,从而我们可以通过接口动态的去改变或添加任务
        scheduledTaskRegistrar.addFixedRateTask(() -> System.out.println("执行定时任务1: " + System.currentTimeMillis()), 1000);
    }

    @Bean(destroyMethod = "shutdown")
    public ScheduledExecutorService taskExecutor() {
        return new ScheduledThreadPoolExecutor(corePoolSize, new ThreadFactoryConfig(feature));
    }
}

或者在一个配置类中直接注入TaskScheduler

    @Bean
    public TaskScheduler taskScheduler() {
        ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
        scheduler.setPoolSize(10);
        return scheduler;
    }   

其他

Task在平时业务开发中确实使用非常的广泛,但在分布式环境下,其实已经很少使用Spring自带的定时器了,而使用分布式任务调度框架:Elastic-job、xxl-job等

@Scheduled同时执行多个定时任务所导致的并发问题 SpringBoot中通过@Scheduled注解开启定时任务,通过控制执行顺序,单线程和多线程下同时执行多个定时任务所导致的并发问题。 阅读详情

相关推荐

Spring定时任务@Scheduled注解使用配置方式(cron表达式、fixedRate和fixedDelay)

Spring定时任务@Scheduled注解使用配置方式(cron表达式、fixedRate和fixedDelay) 序言: 个人推荐一个很方便的在线Cron生成器(网页版):https://qqe2.com/cron/index 一、前言 spring的@Scheduled定时任务相信大家都是十分熟悉。最近在项目开发过程中发现了一些问题,写篇文章,和大家分享一下。结论在最后,想直接看的可以拉到最后。 二、使用 @Scheduled的使用方式十分简单,首先在项目启动类添加注解@E..

技术杠精的博客 1万+

@Scheduled注解的cron自定义配置

@Scheduled注解的cron自定义配置 代码中格式如下: @Scheduled(cron = "${EventTimedTask.cron}") properties配置文件或yml配置文件格式如下: EventTimedTask.cron=0 * * * * * ? cron表达式:(注意:从左往右) 字段 允许值 允许的特殊字符 秒 0-59 ,-*/ 分 0-59 ,-*/ 时 0-23 ,-*/ 日 1-31 ,-*?/LWC 月 1-12 ,-*/ 星

zhangruilinmoo 7581

SpringBoot使用@Scheduled执行定时任务

一直不执行,发现没有配置: &lt;task:annotation-driven/&gt; 这个配置的作用就是使@Scheduled注解生效 整体配置如下: 1 spring-task.xml: &lt;?xml version="1.0" encoding="UTF-8"?&gt; &lt;beans xmlns="http://www.springframework.or...

Top5软件工程硕士,先后在京东、字节从事多年Java后端开发、实时和离线大数据开发 1634

SpringBoot使用@Scheduled注解实现定时任务

序言 Spring 3.0 版本之后自带定时任务,提供了@EnableScheduling注解和@Scheduled注解来实现定时任务功能。 使用SpringBoot创建定时任务非常简单,目前主要有以下三种创建方式: 1、基于注解(@Scheduled) 2、基于接口(SchedulingConfigurer) 前者相信大家都很熟悉,但是实际使用中我们往往想从数据库中读取指定时间来动态执行定时任务,这时候基于接口的定时任务就派上用场了。 3、基于注解设定多线程定时任务 1、基于注解(@Schedu

pan_junbiao的博客 13万+

手把手教你用GEM-2多频电磁仪找地下管道(附真实数据图)

本文详细解析了使用GEM-2多频电磁仪精准定位地下管线的全流程,包括设备调试、频率选择、现场扫描技巧及数据解读。通过真实案例展示了如何应对复杂干扰环境,提升管线检测效率与准确性,特别适合市政工程和地下管线普查。

weixin_42565652的博客 401

手把手教你用MOS管设计双电源自动切换电路(附零压降方案)

本文详细介绍了使用MOS管设计双电源自动切换电路的完整方案,包括基础电路拓扑、零压降优化设计及实战调试技巧。针对外接电源与电池供电的无缝切换需求,提供低损耗MOS管选型建议和性能实测数据,帮助工程师解决传统二极管方案的压降与漏电问题。

h0i1j2k3l的博客 1453

Java-springboot使用注解实现定时器任务

使用springboot解决定时任务非常简单,只需要几个注解就能实现。 1.@EnableScheduling (设置定时器开关启动) 2.@Scheduled(cron = “0 0 0 * * ?”) (设置定时启动时间) 3.@Configuration (表明该类是一个配置类) springboot使用注解设置定时器的用法大致相同,一种是将定时器开关加在了启动类上,第二种是将开...

qq_44614878的博客 8716

故障处理:Oracle一体机磁盘故障时磁盘组重平衡失败的故障处理

摘要: Oracle Exadata一体机出现磁盘故障案例,存储节点故障灯未亮但磁盘已产生大量坏块,导致重平衡失败。文章强调了一体机硬件巡检需检查6个关键维度:节点messages日志、存储cell告警日志、CellCLI日志、ASM告警日志、ILOM日志及服务器信号灯。故障分析显示硬盘物理故障导致磁盘组冗余受损,自动修复流程受阻。文中详细记录了通过CellCLI工具排查损坏磁盘的过程,并提供了完整的故障处理流程和命令输出。文章同步发布于微信公众号"IT民工的龙马人生"和博客网站(www

提供数据库技术支持(系统优化,故障处理,安装升级,数据恢复等) 1231

一步到位:依靠注解@EnableScheduling,@Scheduled 三步解决springboot定时器任务

1.首先在springboot项目启动类上面加上@EnableScheduling注解。 2.然后去到你要实现定时器任务的方法所属的类上面

lfddw的博客 7万+

【Codesys】获取从站信息,判断是否从站断联,总线丢失

获取EtherCAT从站信息,判断是否从站断联,总线丢失

qq_35316470的博客 5733

深入了解AES_GCM算法

常见的对称加密算法,在解密过程中无法确认密钥是否正确的。这就意味着,密文可以用任何密钥执行解密运算,得到一组疑似密文;由于不知道密钥是否正确,故也不能确定解密出来的明文数据是否正确。因此,需要在对称加密算法上增加一层验证机制,常见思路为使用加密算法进行加密保证机密性,使用摘要算法计算MAC保证完整性和真实性,这就涉及到摘要计算和加密计算的前后顺序和参与计算的数据、密钥等,使用起来略微麻烦。

huaqianzkh的专栏 4195

springBoot中@Scheduled执行原理解析

一:前言本文主要介绍Spring Boot中使用定时任务的执行原理。二:@Scheduled使用方式定时任务注解为@Scheduled。使用方式举例如下://定义一个按时...

哲洛不闹的专栏 868

DDR内存Prefetch机制详解:从DDR1到DDR4的技术演进与性能提升

本文深入解析DDR内存Prefetch机制从DDR1到DDR4的技术演进与性能提升。通过分析Prefetch技术的实现原理与Burst传输的协同机制,揭示DDR1的2n Prefetch、DDR2的4n Prefetch、DDR3的8n Prefetch以及DDR4的Bank Group架构创新如何显著提升内存带宽与系统性能。

weixin_30369041的博客 540

@scheduled 执行一次_springBoot中@Scheduled执行原理解析

一:前言本文主要介绍Spring Boot中使用定时任务的执行原理。二:@Scheduled使用方式定时任务注解为@Scheduled。使用方式举例如下://定义一个按时间执行的定时任务,在每天16:00执行一次。@Scheduled(cron = "0 0 16 * * ?")public void depositJob() { //执行代码}//定义一个按一定频率执行的定时任务,每...

weixin_39853523的博客 709

glibc: GLIBC_2.28‘ not found

这个时候,应该怎么解决,因为当前运行的机器是低版本,而程序是高版本,解决方法,或者是将程序降级,或者将当前系统升级。在一个glibc的接口版本是GLIBC_2.25的lab上,运行不了在2.28上编译的程序。看哪一个方便,但是不能通过 临时复制libc.so 文件来解决,因为会遇到下面的错误。所以如果是简单解决就是按照低版本的应用程序,来适配当前系统的glibc版本。比如下面的程序运行提示。

mzhan017的博客 2408

使用libVLC进行视频截图的C/C++实现

通过这些代码,你可以在C/C++应用程序中实现视频截图功能,并将视频帧保存为图像文件。请注意,本文只提供了基本的示例代码,你可以根据自己的需求进行扩展和修改。libVLC是一个强大的开源多媒体框架,可以用于在C/C++应用程序中处理和播放音频和视频文件。我们将展示如何初始化libVLC,打开视频文件,捕获视频帧并保存为图像文件。在开始编写代码之前,你需要包含libVLC的头文件,并链接相应的库文件。在链接阶段,你需要添加libVLC库的链接选项。在使用libVLC之前,你需要初始化libVLC的实例。

学习使你进步。 471

springboot定时任务@Scheduled(1)

为什么我不完全主张自学?①平台上的大牛基本上都有很多年的工作经验了,你有没有想过之前行业的门槛是什么样的,现在行业门槛是什么样的?以前企业对于程序员能力要求没有这么高,甚至十多年前你只要会写个“Hello World”,你都可以入门这个行业,所以以前要入门是完全可以入门的。②现在也有一些优秀的年轻大牛,他们或许也是自学成才,但是他们一定是具备优秀的学习能力,优秀的自我管理能力(时间管理,静心坚持等方面)以及善于发现问题并总结问题。

weixin_42179304的博客 1432

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

springboot 基于@Scheduled注解 实现定时任务

由于篇幅限制,小编在此截出几张知识讲解的图解《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!623)][外链图片转存中…(img-7gvpvVd3-1713400279623)][外链图片转存中…(img-K4SxRfA8-1713400279624)][外链图片转存中…(img-BxZLkfhz-1713400279624)][外链图片转存中…(img-wPfUYU9r-1713400279624)]

2401_84009929的博客 774

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

基于 SpringBoot 的分布式任务中间件 DcsSchedule:从 @Scheduled 到多机任务统一管控的完整设计与实现

> 本文以 CodeGuide 仓库中的 [开发基于SpringBoot的分布式任务中间件DcsSchedule](https://link.gitcode.com/i/274fd735647e6964fa8eb2688fbb504e) 为骨架,完整讲解一个自研 SpringBoot Starter(schedule-spring-boot-starter)如何解决定时任务在大作业量、高实时性、高

gitblog_00736的博客 840

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

springboot定时任务@Scheduled

使用步骤1.在springboot启动类上配置@EnableScheduling 这个一定要加上;否则,不会定时启动任务!2.在你的方法上添加@Scheduled@Scheduled中的参数说明:@Scheduled(fixedRate=2000):上一次开始执行时间点后2秒再次执行;@Scheduled(fixedDelay=2000):上一次执行完毕时间点后2秒再次执行;

2401_83915450的博客 932

springBoot配置定时任务 @Scheduled

新知识点,@Scheduled, 作用:可以通过@Scheduled配置定时任务。 1 package com.example.demo.scheduled; 2 3 import java.time.LocalDateTime; 4 import java.time.format.DateTimeFormatter; 5 6 i...

arag29070的博客 174

SpringBoot注解全解析:从自动配置到自定义注解的底层原理解读

在Java开发中,注解常被视为代码之上的“标签”,但其真实价值在于配合处理器在编译期或运行期改变程序行为。SpringBoot将这一思想发挥到极致,通过@EnableAutoConfiguration与条件注解实现按需装配,使开发人员只需少量配置即可构建应用。理解注解的元数据本质、生命周期以及Spring容器对注解的解析流程,是排查@Transactional失效、AOP不生效等问题的关键。同时,掌握@Target、@Retention等元注解的用法,结合拦截器或AOP切面,可以设计出诸如@RequireL

weixin_31714129的博客 107
上一篇: springboot中@Async注解使用备注
下一篇: @AutoWired与@Resource(以及@Qualifier)
MrMoving
博客等级 码龄10年 54粉丝 145原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值