sched://task scheduler_Task Scheduler

sched://task scheduler_Task SchedulerSpringBoot自带的任务调度是如何实现的?@EnableScheduling@Scheduled注解在任务调度的实现中承担了怎样的角色?ScheduledAnnotationBeanPostProcessor是如何工作的?都参与了ApplicationContext生命周期的哪些环节?调度是通过TaskScheduler实现的,默认的TaskScheduler是怎么创建的?我们如何通过SchedulingConfigurer创建自己的TaskScheduler?


Jetbrains全系列IDE稳定放心使用

1. 添加@EnableScheduling

添加该注解的作用主要是引入SchedulingConfiguration类,该类是一个JavaConfig类,注册了一个BeanPostProcessor类org.springframework.scheduling.annotation.ScheduledAnnotationBeanPostProcessor。接下来重点看一下这个BeanPostProcessor类都做了哪些事情。

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

}

2. ScheduledAnnotationBeanPostProcessor

该类实现接口较多,参考下图:
在这里插入图片描述

3. 任务调度的主要逻辑

3.1 扫描@Scheduled注解方法生成任务

核心方法ScheduledAnnotationBeanPostProcessor#postProcessAfterInitialization,该方法在每个bean初始化完成后调用。

主要逻辑判定当前bean是否有@Scheduled注解的方法,如果存在则创建相应的任务并触发。

3.2 清空任务生成过程中产生的缓存

核心方法ScheduledAnnotationBeanPostProcessor#afterSingletonsInstantiated,该方法在所有单例Bean初始化完成后执行。

主要作用是清空没有@Scheduled注解的类的缓存信息。

3.3 通过TaskScheduler调度任务

核心方法ScheduledAnnotationBeanPostProcessor#onApplicationEvent,该方法在ApplicationContext更新完毕后,通过ContextRefreshedEvent事件触发。

其主要作用是获取taskScheduler,获取taskScheduler的逻辑:
1、是否存在实现SchedulingConfigurer接口的Bean,如果存在则通过SchedulingConfigurer的实现Bean注册调度器(Scheduler)。
2、查看是否有名称为taskScheduler、类型为org.springframework.scheduling.TaskScheduler或java.util.concurrent.ScheduledExecutorService的bean。

任务调度默认使用的是org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler。
该类通过org.springframework.boot.autoconfigure.task.TaskSchedulingAutoConfiguration自动配置类加载。

可以通过配置文件修改线程池大小和线程池前缀等信息。

spring:
  task:
    scheduling:
      thread-name-prefix: sbia-schedule-
      pool:
        size: 4

PS: 以上内容spring-boot-2.1.5.RELEASE,1.5.9.RELEASE版本中没有TaskSchedulingAutoConfiguration自动配置类,默认taskScheduler的值如下:

if (this.taskScheduler == null) { 
   
	this.localExecutor = Executors.newSingleThreadScheduledExecutor();
	this.taskScheduler = new ConcurrentTaskScheduler(this.localExecutor);
}

4. 通过SchedulingConfigurer方式注册TaskScheduler

通过该方法可以注册org.springframework.scheduling.TaskScheduler和java.util.concurrent.ScheduledExecutorService类型的调度器。

/** * 通过该方式设置的Scheduler,默认使用org.springframework.scheduling.concurrent.ConcurrentTaskScheduler */
@Component
public class SbiaSchedulingConfigurer implements SchedulingConfigurer { 
   
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { 
   
        taskRegistrar.setScheduler(new ScheduledThreadPoolExecutor(Runtime.getRuntime().availableProcessors(),
                r -> new Thread(r, "sbia-schedule-")));
    }
}

参考

@Scheduled不生效了:有一天我的定时任务突然不执行了

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/183170.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • java常识-java怎么换行「建议收藏」

    java常识-java怎么换行「建议收藏」文章目录”\r”和”\n”的区别”\r”和”\n”的由来回车键和输入的”\n”有不同吗?系统影响java使用换行符的几种方式“\r”和”\n”的区别回车\r本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即CarriageReturn换行\n本义是光标往下一行(不一定到下一行行首),并不移动左右。n的英文newline,控制字符可以写成LF,即LineFeed也就是说,如果想要到下一行行首,一般的写法应该是”\r\n”,0D0A,即ASCII码对应的‘\r

    2022年7月7日
  • 宽字节注入原理_sqlmap宽字节注入

    宽字节注入原理_sqlmap宽字节注入在mysql中,用于转义的函数有addslashes,mysql_real_escape_string,mysql_escape_string等,还有一种情况是magic_quote_gpc,不过高版本的PHP将去除这个特性。首先,宽字节注入与HTML页面编码是无关的,笔者曾经看到<metacharset=utf8>就放弃了尝试,这是一个误区,SQL注入不是XSS。虽然他们中编码的成…

    2022年10月14日
  • 滴滴大脑告诉你,每一次派单背后都经历了什么[通俗易懂]

    滴滴大脑告诉你,每一次派单背后都经历了什么[通俗易懂]CNET科技资讯网2月23日北京消息:滴滴研究院副院长叶杰平近日在上海一场内部分享会上详解滴滴大脑,这是外部首次窥探到较为完整的滴滴算法世界,并且一直潜水的产品“九霄”也首次露出真容。滴滴大脑由三部分组成叶杰平将滴滴大脑这个智能系统分为三部分,分别是大数据、机器学习和云计算。其中大数据就像工业革命时代的煤一样举足轻重,人工智能需要数据进行…

    2022年5月5日
  • 【Android开发】范例2-实现放大镜效果

    【Android开发】范例2-实现放大镜效果

    2021年9月6日
  • java怎么使用random函数,java中的random函数

    java怎么使用random函数,java中的random函数RandomAccessFile(“C:/MyFile1/Test.java”,”wr”)30、当使用FileInputStream类中的read()方法时,如果没有读入一个字节数据时,返回值为()DA、0……3.Coding:ImplementthesolutioninJava.4.Testing:Makesurethatthenumbersap…

    2022年6月1日
  • matlab控制系统仿真教程答案唐(matlab求传递函数的极点)

    简单的控制算法,没有用Simulink工具,直接写代码。主要点就是分清楚仿真环境和需要验证的算法。也就是说首先要数学建模,建立一个‘环境’,用来模拟实际环境。然后写自己的控制算法。最后把算法用到‘环境’上,就是在仿真了。全部代码如下:%Thesimulationofthestablependulumcart%usingPID,poleplacementandLQRclc;clea…

    2022年4月12日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号