sched://task scheduler_Task Scheduler

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

1. 添加@EnableScheduling

添加该注解的作用主要是引入SchedulingConfiguration类,该类是一个JavaConfig类,注册了一个BeanPostProcessororg.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.TaskSchedulerjava.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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Matlab GUI界面设计

    Matlab GUI界面设计摘要:本篇博文基于MATLAB2014a进行GUI设计。

    2022年4月27日
    43
  • pycharm2021激活码哔哩哔哩【在线注册码/序列号/破解码】

    pycharm2021激活码哔哩哔哩【在线注册码/序列号/破解码】,https://javaforall.net/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

    2022年3月20日
    116
  • eclipse的maven插件(eclipse更新maven仓库)

    打开eclipse的help菜单,选择installnewsoftware项。2、在弹出的窗口中选择whatisalreadyinstalled,就会弹出所有安装的插件,选择maven,点击uninstall,卸载后重启eclipse即可。我的是卸载圈中的这两个…

    2022年4月17日
    141
  • jvm触发full gc条件(Linux内存管理机制)

    1、Java垃圾回收机制GC,即就是Java垃圾回收机制。目前主流的JVM(HotSpot)采用的是分代收集算法。作为Java开发者,一般不需要专门编写内存回收和垃圾清理代码,对内存泄露和溢出的问题。与C++不同的是,Java采用的是类似于树形结构的可达性分析法来判断对象是否还存在引用。即:从gcroot开始,把所有可以搜索得到的对象标记为存活对象。缺点就是:1.有可能不知不…

    2022年4月12日
    78
  • python 查tensorflow版本_如何查看tensorflow的版本「建议收藏」

    python 查tensorflow版本_如何查看tensorflow的版本「建议收藏」本文介绍如何使用pip查看tensorflow的版本号,请查看如下步骤。本文使用的windows10系统,如为linux系统也是同样用pip命令查看。工具/原料window10python3.7(其他python也可以)方法/步骤1通过快捷键windows键+R,打开运行框,输入“cmd”命令,打开命令行窗口2在命令行窗口中输入命令piplist3命令执行后,会列出当前python环…

    2022年6月25日
    300
  • 使用@Profiled注解或自定义AOP拦截打印日志json序列化失败

    使用@Profiled注解或自定义AOP拦截打印日志json序列化失败项目中使用@Profiled注解方式进行统一日志打印输出fastjson踩坑记录一下1:@Profiled注解方式如上图:方法上使用注解@Profiled,因为我的入参有HttpServletResponse,日志打印时会对所有入参进行序列化操作,所对以HttpServletResponse进行JSON.toJSONString()转换会抛出以上异常,此时要么干掉HttpServletResponse,或者换一种方式手动注入HttpServletResponse即可解决以上异常,如下图:

    2022年6月6日
    22

发表回复

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

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