文章目录

  • WHAT
  • WHY
  • HOW
    • 扩展
    • 原理
  • 参考

WHAT

@Scheduled 由Spring定义,用于将方法设置为调度任务。如:方法每隔十秒钟被执行、方法在固定时间点被执行等

  1. @Scheduled(fixedDelay = 1000)
    上一个任务结束到下一个任务开始的时间间隔为固定的1秒,任务的执行总是要先等到上一个任务的执行结束

  2. @Scheduled(fixedRate = 1000)
    每间隔1秒钟就会执行任务(如果任务执行的时间超过1秒,则下一个任务在上一个任务结束之后立即执行)

  3. @Scheduled(fixedDelay = 1000, initialDelay = 2000)
    第一次执行的任务将会延迟2秒钟后才会启动

  4. @Scheduled(cron = “0 15 10 15 * ?”)
    Cron表达式,每个月的15号上午10点15开始执行任务

  5. 在配置文件中配置任务调度的参数

@Scheduled(fixedDelayString = “ f i x e d D e l a y . i n . m i l l i s e c o n d s " ) @ S c h e d u l e d ( f i x e d R a t e S t r i n g = " {fixedDelay.in.milliseconds}") @Scheduled(fixedRateString = " fixedDelay.in.milliseconds")@Scheduled(fixedRateString="{fixedRate.in.milliseconds}”)
@Scheduled(cron = “${cron.expression}”)

WHY

@Scheduled使用方便,不需要自己去写复杂的任务调度。注解的方式非常灵活,只需要在方法上添加@Scheduled注解就能定义调度的任务,任何无参的方法都可以瞬间成为供调度的任务

    /*** 关闭线程池中超过空闲时间的线程* @param poolingConnectionManager* @return*/@Beanpublic Runnable idleConnectionMonitor(final PoolingHttpClientConnectionManager poolingConnectionManager) {return new Runnable() {@Override@Scheduled(fixedDelay = 10000, initialDelay = 1000)public void run() {try {if (poolingConnectionManager != null) {log.info("run IdleConnectionMonitor - Closing expired and idle connections...");poolingConnectionManager.closeExpiredConnections();poolingConnectionManager.closeIdleConnections(properties.getCloseIdleConnectionWaitTimeSecs(), TimeUnit.SECONDS);} else {log.info("run IdleConnectionMonitor - Http Client Connection manager is not initialised");}} catch (Exception e) {log.error("run IdleConnectionMonitor - Exception occurred. msg={}, e={}", e.getMessage(), e);}}};}

HOW

Spring是如何实现如此简洁的任务调度定义的?怎么使用@Scheduled?

  • Requirements
  1. Spring容器中需要创建 Bean: ScheduledAnnotationBeanPostProcessor
  2. Spring容器中需要有TaskScheduler实现类的实例
  3. 无参方法添加@Scheduled注解

扩展

扩展有两种方式

  • 实现SchedulingConfigurer接口
 // 优先级高@Configurationpublic class SchedulerConfig implements SchedulingConfigurer {            @Overridepublic void configureTasks(ScheduledTaskRegistrar taskRegistrar) {taskRegistrar.setTaskScheduler(threadPoolTaskScheduler());}@Bean(destroyMethod = "shutdown")public ThreadPoolTaskScheduler threadPoolTaskScheduler() {ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setThreadNamePrefix("poolmary&mark");scheduler.setPoolSize(50);return scheduler;}}
  • 创建TaskScheduler的实现Bean
 // 相对实现SchedulingConfigurer接口的方式,优先级低@Beanpublic TaskScheduler taskScheduler() {                ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();scheduler.setThreadNamePrefix("poolScheduler");scheduler.setPoolSize(50);return scheduler;}

原理

  1. ScheduledAnnotationBeanPostProcessorpostProcessAfterInitialization方法将@Scheduled的方法包装为指定的task添加到ScheduledTaskRegistrar
  2. ScheduledAnnotationBeanPostProcessor会监听Spring的容器初始化事件,在Spring容器初始化完成后进行TaskScheduler实现类实例的查找,若发现有SchedulingConfigurer的实现类实例,则跳过3
  3. 查找TaskScheduler的实现类实例默认是通过类型查找,若有多个实现则会查找名字为"taskScheduler"的实现Bean,若没有找到则在 ScheduledTaskRegistrar调度任务的时候会创建一个newSingleThreadScheduledExecutor,将TaskScheduler的实现类实例设置到ScheduledTaskRegistrar属性中
  4. ScheduledTaskRegistrarscheduleTasks方法触发任务调度
  5. 真正调度任务的类是TaskScheduler实现类中的ScheduledExecutorService,由J.U.C提供

参考

我的博客

Spring中的@Scheduled相关推荐

  1. 热乎乎的面经:Spring中Scheduled和Async两种调度方式有啥区别?

    最近有小伙伴出去面试,回来跟我说:冰河,我去XXX公司面试,面试官竟然问了我一个关于Spring中Scheduled和Async调度的问题,我竟然没回答上来,你能不能写一篇关于这个问题的文章呢?我:可 ...

  2. 在Spring中使用JDBCJobStore配置Quartz

    我将开始一些有关Quartz Scheduler内部,提示和技巧的系列文章,这是第0章-如何配置持久性作业存储. 在Quartz中,您基本上可以在将作业和触发器存储在内存中以及在关系数据库中进行选择( ...

  3. scheduled一分钟执行一次_Spring 中使用 @Scheduled 创建定时任务

    一.定时任务触发条件 1.在 Application 启动类上添加:@EnableScheduling 2.含定时方法的类上添加注解:@Component,该注解将定时任务类纳入 spring bea ...

  4. scheduled每天下午1点执行一次_在Spring Boot项目中使用@Scheduled注解实现定时任务...

    在java开发中定时任务的实现有多种方式,jdk有自己的定时任务实现方式,很多框架也有定时任务的实现方式.这里,我介绍一种很简单的实现方式,在Spring Boot项目中使用两个注解即可实现. 在sp ...

  5. 在Spring Boot中使用@Scheduled实现定时任务

    2019独角兽企业重金招聘Python工程师标准>>> 在Spring Boot中使用@Scheduled实现定时任务 之前没有使用Spring Boot的Java风格配置的时候,用 ...

  6. Spring中使用Schedule调度

    在spring中两种办法使用调度,以下使用是在spring4.0中. 一.基于application配置文件,配置入下: 1 <bean id="jobDetail" cla ...

  7. Quartz在Spring中设置动态定时任务 .

    什么是动态定时任务: 是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定).这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

  8. java怎么加定时器,Spring中定时器实现

    在一些工作需要使用到定时器,Spring很好的集成了定时器的功能! 在Spring 中使用Quartz,本文介绍Spring3.0以后自主开发的定时任务工具,spring task,可以将它比作一个轻 ...

  9. Quartz在Spring中动态设置cronExpression

    什么是动态定时任务:是由客户制定生成的,服务端只知道该去执行什么任务,但任务的定时是不确定的(是由客户制定). 这样总不能修改配置文件每定制个定时任务就增加一个trigger吧,即便允许客户修改配置文 ...

最新文章

  1. Python组合数据类型之字典类型
  2. 双11个性化推荐背后,阿里云“舜天”如何应对百亿次挑战?
  3. SpringBoot注解最全详解(整合超详细版本)
  4. C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session
  5. Android之编译jni出错解决办法
  6. js怎么动态加载js文件(JavaScript性能优化篇)
  7. 如何导出共享文件夹的权限或转移
  8. 大学计算机学情分析,大学生学情分析
  9. 在ubuntu下使用搜狗的教育网代理
  10. Jenkins 配置mirrors
  11. 薛兆丰经济学课 1-1 人性与稀缺:经济学视角
  12. php+条形码在线怎么生成,php实现在线生成条形码示例分享(条形码生成器)
  13. 基于FDE(有限元差分)算法模拟环形谐振器
  14. 【VCS】Git之无尽探索
  15. android 禁用触摸屏,Touch Protector-安卓禁用手机触摸屏软件
  16. 微信小程序weui在线入门教程-WeUi操作反馈-actionsheet弹出式菜单
  17. 【快速因数分解】Pollard's Rho 算法
  18. 预装64位Win8/8.1电脑安装64位Win7详细过程(单/双系统)
  19. 求解汽车加油问题C++
  20. 编解码学习笔记(一):基本概念

热门文章

  1. 不用找,你想要的酒店餐饮su模型素材都在这里
  2. Qt编写的复杂象棋程序 chessbroad.cpp 错误比较多
  3. 用 HealthKit 来开发一个健身 App
  4. 人民日报大家谈:少儿编程热,需要冷思考
  5. 初识Matlab以及Matlab一般性教程
  6. 淘宝小程序 表单组件checkbox的默认样式修改
  7. 拼多多新年大促活动规则介绍,拓商科技助力店铺突围
  8. swiper循环轮播加文字动画
  9. 堡垒机的主要功能是什么?为什么需要堡垒机?
  10. 小程序支付报错:向微信请求统一下单失败:商户号该产品权限未开通,请前往商户平台>产品中心检查后重试