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)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • babel es6转es5原理_es6兼容es5吗

    babel es6转es5原理_es6兼容es5吗首先需要安装依赖环境npmi–save-devbabel-clibabel-preset安装es5转换npmi–save-devbabel-preset-es2015安装polyfillnpmi–save-devbabel-polyfill安装运行时转换npmi–save-devbabel-plugin-transform-r…

    2022年9月24日
  • 软件测试缺陷报告内容_软件测试缺陷分析

    软件测试缺陷报告内容_软件测试缺陷分析1软件缺陷缺陷是一种泛称,它可以指功能的错误,也可以指性能低下,易用性差等 并不是所有的测试人员都能提交被开发认可的缺陷,也不是测试人员在任何时候都能提交被开发认可的缺陷2什么是软件缺陷软件未达到产品说明书标准的功能 软件出现了产品说明书指明不会出现的错误 软件功能超出产品说明书指明范围 软件未达到产品说明书虽未指出但应达到的目标 软件测试员认为软件难以理解,不易使用,运行速度缓慢,或者最终用户认为不好3缺陷产生的原因4发现缺陷用户体验不够好 界面上有明显的错误信

    2022年9月17日
  • SSH学习笔记「建议收藏」

    SSH学习笔记「建议收藏」SSH学习笔记github主页:https://github.com/Taot-chen1、ssh(secureshell)安装:sudoapt-getinstallopenssh-server/openssh-client查看ssh服务是否开启:netstat-tlp|grepssh启动/重启/停止ssh服务:sudo/etc/init.d/ssdstart/restart/stop查看系统信息:cat/etc/os-release

    2022年6月24日
  • BM3D算法相关笔记

    BM3D算法相关笔记三维矩阵主要原因就在于,三维矩阵中,第一维度代表行,第二维度代表列,第三维度代表页,当第三维度为1时,代表只有1页,自然缩减为二维。当第一维度为1时,代表只有一行,但是每页都有,所以,从物理的角度没有缩减为二维。http://blog.sina.com.cn/s/blog_7519cf530101ahsb.html

    2022年5月2日
  • 编写测试用例方法—-因果图&判定表

    编写测试用例方法—-因果图&判定表因果图:一、应用场合       在一个界面中,有多个控件,测试的时候要考虑控件的组合关系,不同的控件组合会产生不同的输出结果的组合,为了弄清什么样的输入组合会产生什么样的输出组合,使用因果图法。 二、因果图核心1、因—-原因,输入条件2、果—-结果,输出结果使用图形的方式,分析软件输入和输出的对应关系。 三、图形符号1、基本图形    表示输入和输出的对应关系(1)恒等(-)Ⓐ(输入、因…

    2022年8月14日
  • 编程路上必定要知道的数据库语言SPL

    编程路上必定要知道的数据库语言SPL要说清这个目标,先要理解数据库是做什么的。数据库这个软件,名字中有个“库”字,会让人觉得它主要是为了存储的。其实不然,数据库实现的重要功能有两条:计算、事务!也就是我们常说的OLAP和OLTP,数据库的存储都是为这两件事服务的,单纯的存储并不是数据库的目标。我们知道,SQL是目前数据库的主流语言。那么,用SQL做这两件事是不是很方便呢?事务类功能主要解决数据在写入和读出时要保持的一致性,实现这件事的难度并不小,但对于应用程序的接口却非常简单,用于操纵数据库读写的代码也很简单。如果假定目前关系数据库的逻辑存储

    2022年10月6日

发表回复

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

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