本文测试了@scheduled注解中参数cron,fixedDelay,fixedRate参数周期性调度任务时,任务执行时长不同对任务调度的影响情况,包含作业任务执行时长小于任务执行周期,作业任务执行时长与任务执行频率同频,作业任务执行时长大于任务执行周期的三种情况,用于对实际业务设置定时执行作为参考。

第一种.cron参数周期性执行不同时长业务分析

情况1:调度周期大于任务执行时长情况

模拟定时周期为3秒执行一次,任务执行耗时1秒,执行结果如图所示:第一次作业开始时间为16:25:36,结束时间为16:25:37,第二次作业开始时间为:16:25:39,结束时间为16:25:40,第三次作业开始时间为16:25:43。由执行结果可知:作业调度依次间隔为3秒钟时间执行一次,符合预期。

 /***  任务周期3S 模拟作业执行时长 1S*/@Scheduled(cron = "0/3 * * * * ?")public void testJobCron() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(1000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

情况2:调度周期与任务执行时长相同的情况

模拟定时周期为3秒执行一次,任务执行耗时3秒,执行结果如图所示:第一次作业开始时间为16:31:48,结束时间为16:31:51,第二次作业开始时间为:16:31:54,结束时间为16:31:57,第三次作业开始时间为16:32:00。由执行结果可知:作业调度间隔已经不是3秒钟时间执行一次(作业完后3秒执行下一次调度),不符合预期。

 /***  任务周期3S 模拟作业执行时长 3S*/@Scheduled(cron = "0/3 * * * * ?")public void testJobCron() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(3000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

情况3:调度周期小于任务执行时长的情况

模拟定时周期为3秒执行一次,任务执行耗时5秒,执行结果如图所示:第一次作业开始时间为16:33:24,结束时间为16:33:29,第二次作业开始时间为:16:33:30,结束时间为16:33:35,第三次作业开始时间为16:33:36。由执行结果可知:任务调度间隔不为3秒钟时间执行一次(作业完后隔1秒钟执行下一次调度),不符合预期。

    /***  任务周期3S 模拟作业执行时长 5S*/@Scheduled(cron = "0/3 * * * * ?")public void testJobCron() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(5000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

第二种.fixedRate参数周期性执行不同时长业务分析

情况1:调度周期大于任务执行时长情况

模拟定时周期为3秒执行一次,任务执行耗时1秒,执行结果如图所示:第一次作业开始时间为16:35:45,结束时间为16:35:46,第二次作业开始时间为:16:35:48,结束时间为16:35:49,第三次作业开始时间为16:35:51。由执行结果可知:作业调度依次间隔为3秒钟时间执行一次,符合预期。

 /*** 3S执行一次 模拟作业执行时长1S* 上一次开始执行时间点之后多长时间再执行*/@Scheduled(fixedRate = 3000L)public void testJobFixedRate() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(1000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

情况2:调度周期与任务执行时长相同的情况

模拟定时周期为3秒执行一次,任务执行耗时3秒,执行结果如图所示:第一次作业开始时间为16:37:20,结束时间为16:37:23,第二次作业开始时间为:16:37:23,结束时间为16:37:26,第三次作业开始时间为16:37:26。由执行结果可知:作业调度间隔3秒钟时间执行一次(作业完后立即执行下一次调度),符合预期。

 /*** 3S执行一次 模拟作业执行时长3S* 上一次开始执行时间点之后多长时间再执行*/@Scheduled(fixedRate = 3000L)public void testJobFixedRate() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(3000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

情况3:调度周期小于任务执行时长的情况

模拟定时周期为3秒执行一次,任务执行耗时5秒,执行结果如图所示:第一次作业开始时间为16:39:52,结束时间为16:39:57,第二次作业开始时间为:16:39:57,结束时间为16:40:02,第三次作业开始时间为16:40:02。由执行结果可知:任务调度间隔不为3秒钟时间执行一次(作业完后立即执行下一次调度,调度间隔由任务执行时长决定),不符合预期。

 /*** 3S执行一次 模拟作业执行时长5S* 上一次开始执行时间点之后多长时间再执行*/@Scheduled(fixedRate = 3000L)public void testJobFixedRate() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(5000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

第三种.fixedDelay参数周期性执行不同时长业务分析

情况1:调度周期大于任务执行时长情况

模拟定时周期为3秒执行一次,任务执行耗时1秒,执行结果如图所示:第一次作业开始时间为16:42:32,结束时间为16:42:33,第二次作业开始时间为:16:42:36,结束时间为16:42:37,第三次作业开始时间为16:42:40。由执行结果可知:作业调度依次为执行结束后间隔3秒钟时间执行下一次任务,符合预期。

 /*** 3S执行一次 模拟作业执行时长1S* 上一次执行完毕时间点之后多长时间再执行*/@Scheduled(fixedDelay = 3000L)public void testJobFixedDelay() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(1000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

情况2:调度周期与任务执行时长相同的情况

模拟定时周期为3秒执行一次,任务执行耗时3秒,执行结果如图所示:第一次作业开始时间为16:44:11,结束时间为16:44:14,第二次作业开始时间为:16:44:17,结束时间为16:44:20,第三次作业开始时间为16:44:23。由执行结果可知:作业调度依次为执行结束后间隔3秒钟时间执行下一次任务,符合预期。

 /*** 3S执行一次 模拟作业执行时长3S* 上一次执行完毕时间点之后多长时间再执行*/@Scheduled(fixedDelay = 3000L)public void testJobFixedDelay() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(3000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

情况3:调度周期小于任务执行时长的情况

模拟定时周期为3秒执行一次,任务执行耗时5秒,执行结果如图所示:第一次作业开始时间为16:45:57,结束时间为16:46:02,第二次作业开始时间为:16:46:05,结束时间为16:46:10,第三次作业开始时间为16:46:13。由执行结果可知:作业调度依次为执行结束后间隔3秒钟时间执行下一次任务,符合预期。

 /*** 3S执行一次 模拟作业执行时长5S* 上一次执行完毕时间点之后多长时间再执行*/@Scheduled(fixedDelay = 3000L)public void testJobFixedDelay() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(5000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}

@scheduled注解参数简介

1.cron

支持cron表达式方式进行作业调度。

2.zone

将解析 cron 表达式的时区。默认情况下,此属性是空字符串(即将使用服务器的本地时区)。

3.fixedDelay

上一次执行完毕时间点之后多长时间再执行。

4.fixedDelayString

意思fixedDelay相同,只是使用字符串的形式。支持配置文件中配置参数,采用占位符获取配置参数的情形。

5.fixedRate

上一次开始执行时间点之后多长时间再执行。

6.fixedRateString

意思fixedRate相同,只是使用字符串的形式。支持配置文件中配置参数,采用占位符获取配置参数的情形。

7.initialDelay

配合fixedDelay与fixedRate一起使用,在第一次执行任务之前延迟的毫秒数。

8.initialDelayString

意思initialDelay相同,只是使用字符串的形式。支持配置文件中配置参数,采用占位符获取配置参数的情形

测试类方法

测试类不包含包名,可自行导入,有兴趣的同学还可以观察一下线程ID,可以测试一下多个调度任务线程执行情况。

import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;@Slf4j
@Component
@EnableScheduling
public class TestHandleJob {/***  任务周期3S 模拟作业执行时长 1S*/@Scheduled(cron = "0/3 * * * * ?")public void testJobCron() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(1000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}/*** 3S执行一次 模拟作业执行时长5S* 上一次开始执行时间点之后多长时间再执行*///@Scheduled(fixedRate = 3000L)public void testJobFixedRate() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(5000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}/*** 3S执行一次 模拟作业执行时长5S* 上一次执行完毕时间点之后多长时间再执行*///@Scheduled(fixedDelay = 3000L)public void testJobFixedDelay() throws InterruptedException {log.info("->TID:{}任务开始{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());Thread.sleep(5000);log.info("<-TID:{}任务结束{}",Thread.currentThread().getId(), DateUtil.currentLongDateTime());}}

Spring @scheduled注解周期性执行超时任务对任务调度的影响分析相关推荐

  1. 使用轻量级Spring @Scheduled注解执行定时任务

    WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了 ...

  2. 使用spring @Scheduled注解执行定时任务

    在springMVC里使用spring的定时任务非常的简单,如下: (一)在xml里加入task的命名空间 xmlns 多加下面的内容 1 xmlns:task="http://www.sp ...

  3. spring @Scheduled 注解实现的定时任务 3步走

    适用场景 1) Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务. 最早的时候就是这样写定时任务的.  2) 开源的第三方框架: Quar ...

  4. java 静态代码块和spring @value注解注入执行顺序

    https://blog.csdn.net/evo_steven/article/details/86005965

  5. java @Scheduled注解执行定时任务

    使用spring @Scheduled注解执行定时任务: @Scheduled(cron = "0 0 2 * * ?") //每天凌晨2点@RequestMapping(&quo ...

  6. scheduled java_java使用@Scheduled注解执行定时任务

    前言 在写项目的时候经常需要特定的时间做一些特定的操作,尤其是游戏服务器,维护线程之类的,这时候就需要用到定时器. 如果此时你刚好用的是spring的话,哪么@scheduled注解是非常好用的. 使 ...

  7. java scheduled_怎么在java中利用@Scheduled注解执行定时任务

    怎么在java中利用@Scheduled注解执行定时任务 发布时间:2021-01-13 16:52:56 来源:亿速云 阅读:84 作者:Leah 本篇文章给大家分享的是有关怎么在java中利用@S ...

  8. SpringBoot定时任务@Scheduled注解详解

    SpringBoot定时任务@Scheduled注解详解 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发 概述 要使用@Scheduled注解 ...

  9. @Scheduled注解用法

    项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发,要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用S ...

  10. 定时任务 @Scheduled注解的学习

    定时任务 @Scheduled注解的学习 Spring中提供了@Scheduled注解,目的是为了方便进行定时任务的开发. 要使用@Scheduled注解,首先需要在启动类添加@EnableSched ...

最新文章

  1. 不写代码,用图形界面搞机器学习:MIT发布“全球最快AutoML”,刷新DARPA比赛成绩...
  2. [Music]A Place Nearby
  3. xmind思维导图之如何进行深度工作
  4. nginx连接uwsgi使用web.py框架构造pythonweb项目
  5. sci-hub谷歌插件_Google Home Hub具有隐藏屏幕设置菜单
  6. ExtJs2.0学习系列(5)--Ext.FormPanel之第二式
  7. Solaris 图形化界面登陆的控制
  8. 网站做好后,不想买服务器可以用自己的电脑当服务器么?
  9. Nginx负载均衡与健康检查
  10. Android 配置 junit 单元测试
  11. 马哥 python培训
  12. 【U+】友加畅捷U+通用财务清理操作员密码
  13. 北大核心期刊目录2021年 计算机类
  14. python 傅里叶变换_理解快速傅里叶变换算法
  15. 开发笔记--项目部署到linux服务器
  16. matlab:数组定义
  17. 【龙讯module小课堂】“光”怪陆离:PWmat计算光学性质(三)
  18. 服务器定时任务是通过什么样的方式实现的
  19. 帝国cms php序号,帝国cms输出数字排序序号的列表
  20. html5+css3满天星星音乐背景动画特效(超炫酷)

热门文章

  1. ps中给图层新建文件夹
  2. 祝你生日快乐+两只老虎简谱
  3. undertale人物_传说之下人物介绍
  4. TestCenter测试管理工具功能详解十二(Q)
  5. [ZZ]为什么选择傲游
  6. app开发都有哪些基本的开发语言选择?
  7. Java 全栈知识体系
  8. [Asp.net Core]局部视图
  9. Python学习笔记之八皇后问题
  10. 高德地图初步使用-多点路线连接