首页 / 知识
SpringBoot定时任务@Scheduled注解详解
2023-04-11 16:18:00

SpringBoot定时任务@Scheduled注解详解
项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发
概述
要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用Spring的计划任务执行功能,这样可以在容器中的任何Spring管理的bean上检测@Scheduled注解,执行计划任务
注解定义
@Target({ElementType.METHOD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repeatable(Schedules.class)
public @interface Scheduled {
String cron() default "";
String zone() default "";
long fixedDelay() default -1;
String fixedDelayString() default "";
long fixedRate() default -1;
String fixedRateString() default "";
long initialDelay() default -1;
String initialDelayString() default "";
}
参数说明
参数 参数说明 示例
cron 任务执行的cron表达式 0/1 * * * * ?
zone cron表达时解析使用的时区,默认为服务器的本地时区,使用java.util.TimeZone#getTimeZone(String)方法解析 GMT-8:00
fixedDelay 上一次任务执行结束到下一次执行开始的间隔时间,单位为ms 1000
fixedDelayString 上一次任务执行结束到下一次执行开始的间隔时间,使用java.time.Duration#parse解析 PT15M
fixedRate 以固定间隔执行任务,即上一次任务执行开始到下一次执行开始的间隔时间,单位为ms,若在调度任务执行时,上一次任务还未执行完毕,会加入worker队列,等待上一次执行完成后立即执行下一次任务 2000
fixedRateString 与fixedRate逻辑一致,只是使用java.time.Duration#parse解析 PT15M
initialDelay 首次任务执行的延迟时间 1000
initialDelayString 首次任务执行的延迟时间,使用java.time.Duration#parse解析 PT15M
源码解析
配置了@Scheduled注解的方法,Spring的处理是通过注册ScheduledAnnotationBeanPostProcessor来执行,将不同配置参数的任务分配给不同的handler处理,核心代码如下
org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor#postProcessAfterInitialization
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) {
if (bean instanceof AopInfrastructureBean || bean instanceof TaskScheduler ||
bean instanceof ScheduledExecutorService) {
// Ignore AOP infrastructure such as scoped proxies.
return bean;
}
Class<?> targetClass = AopProxyUtils.ultimateTargetClass(bean);
if (!this.nonAnnotatedClasses.contains(targetClass) &&
AnnotationUtils.isCandidateClass(targetClass, Arrays.asList(Scheduled.class, Schedules.class))) {
Map<Method, Set<Scheduled>> annotatedMethods = MethodIntrospector.selectMethods(targetClass,
(MethodIntrospector.MetadataLookup<Set<Scheduled>>) method -> {
Set<Scheduled> scheduledMethods = AnnotatedElementUtils.getMergedRepeatableAnnotations(
method, Scheduled.class, Schedules.class);
return (!scheduledMethods.isEmpty() ? scheduledMethods : null);
});
if (annotatedMethods.isEmpty()) {
this.nonAnnotatedClasses.add(targetClass);
if (logger.isTraceEnabled()) {
logger.trace("No @Scheduled annotations found on bean class: " + targetClass);
}
}
else {
// Non-empty set of methods
annotatedMethods.forEach((method, scheduledMethods) ->
scheduledMethods.forEach(scheduled -> processScheduled(scheduled, method, bean)));
if (logger.isTraceEnabled()) {
logger.trace(annotatedMethods.size() + " @Scheduled methods processed on bean '" + beanName +
"': " + annotatedMethods);
}
}
}
return bean;
}
|
最新内容
相关内容
python怎样注解一段
python怎样注解一段,培训,注释,内容,注解,结尾,开头,全部,语法,以上,程序,python注解一段的方法:多行注释指的是可以一次性注释程序中多行的python定时修改数据库
python定时修改数据库,时间,服务,培训,单位,代码,标准,线程,操作,时间差,进程,1.传入执行改库操作的时间update_time,用update_time和当前时间python求和函数sum()详解
python求和函数sum()详解,培训,函数,结果,字典,详解,对象,总和,恍然大悟,语法,个数,今天在学习的过程中,误用sum()函数,我又去查了查pythonsum(python详解Python垃圾回收机制
python详解Python垃圾回收机制,技术,时间,培训,对象,系统,名字,垃圾,标记,机制,内存,引用计数python默认的垃圾收集机制是“引用计数”,每个对python详解python包管理器pip安装
python详解python包管理器pip安装,培训,管理,工具,方法,详解,源码,可能会,脚本,模块,以上,pip对于使用python的朋友并不陌生,当你想安装pythonpython详解python中单引号,双引号,多
python详解python中单引号,双引号,多引号区别,培训,字符串,表示,区别,引号,注释,详解,下面,原因,字符,先说1双引号与3个双引号的区别,python双引我在哪里可以得到Antlr Ant任务?
我在哪里可以得到Antlr Ant任务?,我在哪里可以得到Antlr Ant任务?,调用,我在,找不到,试图,Where do I get the Antlr Ant task?我试图关于 .net:使用 C# 发送鼠标点击到
关于 .net:使用 C# 发送鼠标点击到任务栏中的按钮,关于 .net:使用 C# 发送鼠标点击到任务栏中的按钮,应用程序,前台,调用,在我,Sending关于c#:如何在构建后自动执行重复性
关于c#:如何在构建后自动执行重复性任务?,关于c#:如何在构建后自动执行重复性任务?,项目,运行,这一点,但这,How do I automate repetitiv关于内存不足:Visual Studio 错误:&#
关于内存不足:Visual Studio 错误:GenerateResource任务意外失败,关于内存不足:Visual Studio 错误:GenerateResource任务意外失败,项目关于Visual Studio:预构建任务-在Cr
关于Visual Studio:预构建任务-在CruiseControl.NET中删除工作副本,关于Visual Studio:预构建任务-在CruiseControl.NET中删除工作副如何在Ruby脚本中运行Rake任务?
如何在Ruby脚本中运行Rake任务?,如何在Ruby脚本中运行Rake任务?,调用,命令行,我想,我有一个,How do I run Rake tasks within a Ruby s