Spring @scheduled注解周期性执行超时任务对任务调度的影响分析
本文测试了@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注解周期性执行超时任务对任务调度的影响分析相关推荐
- 使用轻量级Spring @Scheduled注解执行定时任务
WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了 ...
- 使用spring @Scheduled注解执行定时任务
在springMVC里使用spring的定时任务非常的简单,如下: (一)在xml里加入task的命名空间 xmlns 多加下面的内容 1 xmlns:task="http://www.sp ...
- spring @Scheduled 注解实现的定时任务 3步走
适用场景 1) Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务. 最早的时候就是这样写定时任务的. 2) 开源的第三方框架: Quar ...
- java 静态代码块和spring @value注解注入执行顺序
https://blog.csdn.net/evo_steven/article/details/86005965
- java @Scheduled注解执行定时任务
使用spring @Scheduled注解执行定时任务: @Scheduled(cron = "0 0 2 * * ?") //每天凌晨2点@RequestMapping(&quo ...
- scheduled java_java使用@Scheduled注解执行定时任务
前言 在写项目的时候经常需要特定的时间做一些特定的操作,尤其是游戏服务器,维护线程之类的,这时候就需要用到定时器. 如果此时你刚好用的是spring的话,哪么@scheduled注解是非常好用的. 使 ...
- java scheduled_怎么在java中利用@Scheduled注解执行定时任务
怎么在java中利用@Scheduled注解执行定时任务 发布时间:2021-01-13 16:52:56 来源:亿速云 阅读:84 作者:Leah 本篇文章给大家分享的是有关怎么在java中利用@S ...
- SpringBoot定时任务@Scheduled注解详解
SpringBoot定时任务@Scheduled注解详解 项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发 概述 要使用@Scheduled注解 ...
- @Scheduled注解用法
项目开发中,经常会遇到定时任务的场景,Spring提供了@Scheduled注解,方便进行定时任务的开发,要使用@Scheduled注解,首先需要在启动类添加@EnableScheduling,启用S ...
- 定时任务 @Scheduled注解的学习
定时任务 @Scheduled注解的学习 Spring中提供了@Scheduled注解,目的是为了方便进行定时任务的开发. 要使用@Scheduled注解,首先需要在启动类添加@EnableSched ...
最新文章
- 不写代码,用图形界面搞机器学习:MIT发布“全球最快AutoML”,刷新DARPA比赛成绩...
- [Music]A Place Nearby
- xmind思维导图之如何进行深度工作
- nginx连接uwsgi使用web.py框架构造pythonweb项目
- sci-hub谷歌插件_Google Home Hub具有隐藏屏幕设置菜单
- ExtJs2.0学习系列(5)--Ext.FormPanel之第二式
- Solaris 图形化界面登陆的控制
- 网站做好后,不想买服务器可以用自己的电脑当服务器么?
- Nginx负载均衡与健康检查
- Android 配置 junit 单元测试
- 马哥 python培训
- 【U+】友加畅捷U+通用财务清理操作员密码
- 北大核心期刊目录2021年 计算机类
- python 傅里叶变换_理解快速傅里叶变换算法
- 开发笔记--项目部署到linux服务器
- matlab:数组定义
- 【龙讯module小课堂】“光”怪陆离:PWmat计算光学性质(三)
- 服务器定时任务是通过什么样的方式实现的
- 帝国cms php序号,帝国cms输出数字排序序号的列表
- html5+css3满天星星音乐背景动画特效(超炫酷)