定时任务重启后执行策略_定时任务时间过长会不会影响下次的执行? 第331篇...
相关历史文章(阅读本文前,您可能需要先看下之前的系列?)
国内最全的Spring Boot系列之三
2020上半年发文汇总「值得收藏」
立方阶时间复杂度怎么算-征战沙场- 第326篇
SpringBoot的controller为什么不能并行执行?同一个浏览器连续多次访问同一个url竟然是串行的?- 第329篇
悟纤:定时任务如果执行的时间很长的话,那么下一次还能按时执行嘛?
师傅:To be or notto be,that is a question.
悟纤:师傅?
师傅:你这个问题吗?为师也不是一两句话就能够和你说明白的。
悟纤:那就用三句话说明一下。
师傅:你这杠精又要来了,打住。
悟纤:师傅,师傅,你赶紧和徒儿讲讲吗。
师傅:那今天为师就和你好好聊聊。
前言
有关定时任务会不会延迟执行了,可以看文章《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》
https://mp.weixin.qq.com/s/G1-92E7jvvy5Ngp7nIIykg
本质上来讲,我们这一篇文章的问题的答案在上一篇已经算是给出了答案了,只是没有那么明确,这一节我们来明确的说一下。
针对这个问题「定时任务时间过长会不会影响下次的执行」,也是考虑定时任务是单线程的还是多线程的。
一、单线程
有这么一个定时任务:
@Scheduled(cron="10 * * * * ? ") public void aTask(){ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(Thread.currentThread().getName()+":" +sdf.format(new Date())+" --> A任务每10秒执行一次"); try { TimeUnit.SECONDS.sleep(70); } catch (InterruptedException e) { e.printStackTrace(); } }
如果按照我们的想像的情况下,现在8:00:00的话,那么8:00:10的时候执行第一次,8:01:10的时候执行第二次,以此类推,但是在单线程的情况下却不是这样子执行的,当让我们的定时任务执行过长超过了下一次要执行的时候,那么就需要等到下一次才能执行了,我们看下执行的情况:
scheduling-1:2020-09-28 20:02:10--> A任务每10秒执行一次
scheduling-1:2020-09-28 20:04:10--> A任务每10秒执行一次
scheduling-1:2020-09-28 20:06:10--> A任务每10秒执行一次
中间总是会隔了1分钟。
二、多线程
如何开启多线程还不懂嘛,那么请阅读《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》。
在多线程情况下,结果是什么样子呢?我们还是直接看下控制塔的打印在来给出结果吧:
myThread-1:2020-09-28 20:09:10--> A任务每10秒执行一次
myThread-1:2020-09-28 20:11:10--> A任务每10秒执行一次
从这里我们可以看出多线程情况下还是有影响的。
三、异步任务
如何在定时任务中使用异步任务还不懂嘛,那么请阅读《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》。
在异步任务的情况下,我们看下结果:
task-1:2020-09-28 20:13:10 -->A任务每10秒执行一次
task-2:2020-09-28 20:14:10 -->A任务每10秒执行一次
从这里我们可以看出在异步任务的情况下,就不会延迟了,从上面的打印我们可以看出是不同的任务在执行下一次的定时任务。即使上一个任务还没执行完成也不影响下一次的执行了。
四、多线程定时任务执行时间过长的思考
这里我们主要是针对开启了多线程的情况下,单线程为啥不考虑呐。
我们在文章《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》中说明,如果有两个任务A和B,如果A执行过长的话是会影响B的执行的。
那么在实际项目中,我们肯定不希望A的执行影响到B的执行了。所以正常情况下都会开启多线程的支持的。
在接下来的讨论都是基于多线程开启的情况下的定时任务的思考。
4.1 同一个定时任务执行时间过长会影响下一次的执行吗?
这个我们在前面分析了,答案是会有影响的,那么如何解决这个问题呐?
有两种思路:①使用异步任务,使用@Async即可。②使用线程,将耗时的代码放到线程的run方法中进行执行。
①使用异步任务,使用@Async即可
@Scheduled(cron="10 * * * * ? ") @Async //使用异步任务,使用@Async即可 public void aTask(){ DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(Thread.currentThread().getName()+":" +sdf.format(new Date())+" --> A任务每10秒执行一次"); try { TimeUnit.SECONDS.sleep(70); } catch (InterruptedException e) { e.printStackTrace(); } }
②使用线程,将耗时的代码放到线程的run方法中进行执行。
@Scheduled(cron="10 * * * * ? ") public void aTask(){ new Thread() { public void run() { DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println(Thread.currentThread().getName()+":" +sdf.format(new Date())+" --> A任务每10秒执行一次"); try { TimeUnit.SECONDS.sleep(70); } catch (InterruptedException e) { e.printStackTrace(); } }; }.start(); }
4.2 不同定时任务会互相影响吗?
这个是不会影响的,我们在之前的文章中已经说明过了,这里不重复进行说明了。
4.3 重复执行问题如何解决?
如果我们解决了定时任务执行过长影响下一次执行的问题,也就是能够根据设置的表达式进行定时执行了,那么又会可能产生什么新的问题呢?就是定时任务重复执行的问题。
一般我们的定时任务都会查库然后进行操作的,如果此时上一个定时任务未执行完成,下次的定时任务又开始了,那么很有可能会获取到重复的数据。那么定时任务就会被重复执行了。
这里提供两种思路进行解决吧:
(1)锁表行记录:如果这表就是一个定时任务的表的话,那么可以将表行记录进行锁住。如果不是定时任务的表,是其它业务表的话,锁表行记录就不可行了。
(2)缓存id:我们一般获取到的数据都是有id的,那么我们可以将当前正在处理的id缓存起来,如果下个任务进来了,发现此id已经在缓存中,说明这个id已经正在定时任务中进行处理了,直接舍此id,进行下个id即可。。
4.4不同的任务类中的定时任务方法也会互相影响吗(单线程下)
会相互影响的,Spring单线程的话,会管理所有的定时任务的,和是否是不是一个类定义的定时任务没有关系。
测试结果如下(MyTask1和MyTask2):
scheduling-1:2020-07-02 15:04:25--> B任务每5秒执行一次
scheduling-1:2020-07-02 15:04:30--> A任务每10秒执行一次
scheduling-1:2020-07-02 15:04:50--> B任务每5秒执行一次
scheduling-1:2020-07-02 15:04:55--> B任务每5秒执行一次
我们会发现在默认配置单线程的情况下,B任务收到影响了,一旦A任务执行的话,B任务就会延迟执行了。
悟纤小结
我们把《为什么你要阻碍我,你看我扎不扎你「见鬼,定时任务延迟执行?」 - 第292篇》和本节的知识做个汇总。
师傅:徒儿,你表现的时候到了。
悟纤:师傅,我来也。
(1)单线程情况下A任务的延迟会影响到B任务的执行。
(2)引起定时任务延迟原因:Spring/Spring Boot的定时任务默认是单线程 (敲重点)。
(3)解决定时任务延迟问题:异步任务和多线程(敲重点)。
(4)异步任务定时任务执行情况:A/B任务互相不影响,A的定时任务执行过长不会影响A的下次执行。
(5)多线程定时任务执行情况:A/B任务互相不影响,A的定时任务执行过长会影响到A的下次执行。
(6)定时任务重复执行的方案:①锁表行记录(不能锁业务表行记录,因为可能会影响正常的业务执行);②缓存ID(可以是任务ID,也可以是业务表ID)
我就是我,是颜色不一样的烟火。我就是我,是与众不同的小苹果。
à悟空学院:https://t.cn/Rg3fKJD
学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!
SpringBoot视频:http://t.cn/A6ZagYTi
Spring Cloud视频:http://t.cn/A6ZagxSR
SpringBoot Shiro视频:http://t.cn/A6Zag7IV
SpringBoot交流平台:https://t.cn/R3QDhU0
SpringData和JPA视频:http://t.cn/A6Zad1OH
SpringSecurity5.0视频:http://t.cn/A6ZadMBe
ShardingJDBC分库分表:http://t.cn/A6ZarrqS
分布式事务解决方案:http://t.cn/A6ZaBnIr
JVM内存模型调优实战:http://t.cn/A6wWMVqG
Spring入门到精通:https://t.cn/A6bFcDh4
定时任务重启后执行策略_定时任务时间过长会不会影响下次的执行? 第331篇...相关推荐
- 定时任务重启后执行策略_quartz定时任务框架调度机制解析
quartz2.2.1集群调度机制调研及源码分析 引言 quartz集群架构 调度器实例化 调度过程 触发器的获取 触发trigger: Job执行过程: 总结: 附: 引言 quratz是目前最为成 ...
- android 重启后进入安全模式_图文详细教程:台式电脑或笔记本也可以运行Android系统,凤凰OS...
安装完Android系统后会和Windows双系统共存,并不会影响原来系统的数据安全,不用担心! 好了,简单粗暴,第一步:下载凤凰OS安卓系统.附官网下载链接http://www.phoenixos. ...
- Explorer.exe系统错误,电脑重启后刚开始一段时间正常,过一会桌面任务栏就卡死,可以打开任务管理器
环境: 联想E14 Win10专业版 问题描述: 1.重启系统后刚开始一段时间点击任务栏正常,过一会桌面任务栏就卡死,可以打开任务管理器,任务管理器查看shell infrastructure占用cp ...
- mysql服务重启后不见了_一次诡异的Mysql服务不断重启故障排查
前段时间,有测试人员联系我,寻求帮助,让我帮忙看看,测试环境的一台mysql数据库不断的重启,导致他们的测试无法进行,时间拖的长了,会影响上线进度. 下面就来说说现象 在一个测试环境,mysql5.7 ...
- 定时任务重启后执行策略_windows使用计划任务定时重新启动电脑
Windows系统的任务计划程序,可以添加计划任务,设置任务开始时间及执行的间隔,实现应用的自动执行.例如:实现定时重启.关机等常见的功能.如何使用参考以下步骤: 1.单击开始--任务计划程序(右键我 ...
- 定时任务重启后执行策略_C语言操作时间函数time.ctime,实现定时执行某个任务小例子...
时间操作函数在实际项目开发中会经常用到,最近做项目也正好用到就正好顺便整理一下. 时间概述 由上图可知: 通过系统调用函数time()可以从内核获得一个类型为time_t的1个值,该值叫calenda ...
- 建立唯一索引后mysql策略_【MySQL】MySQL索引背后的之使用策略及优化【转】
另外很不错的对于索引及索引优化的文章: 索引的使用 示例数据库 为了讨论索引策略,需要一个数据量不算小的数据库作为示例.本文选用MySQL官方文档中提供的示例数据库之一:employees.这个数据库 ...
- 黑苹果睡眠重启后死机_苹果8p突然黑屏,卡机,死机等怎么办?苹果8p维修指南
大部分使用苹果手机的用户,实际上对于iPhone并不是十分了解!在使用中常常会遇到各种情况!比如苹果8p突然黑屏,卡机,死机.排除摔机.进水这些因素,就使用中苹果8p突然黑屏,卡机,死机无法开机的情况 ...
- 电脑更新重启后黑屏_电脑进入系统后黑屏怎么办?
现代社会中,电脑已经是一个必不可少的物品,不管是工作还是生活.但是,电脑使用时间久了,难免会出现一些问题,最近有小伙伴咨询电脑开机进入系统黑屏的情况,不知道怎么解决,下面让我们一起来看看吧! 电脑进入 ...
最新文章
- 都是推荐系统,广告算法和推荐算法有啥区别?
- LoadRunner函数学习--lr_convert_string_encoding
- 在caffe中使用hdf5的数据
- 设计模式学习笔记五——Prototype模式
- 【Java】Mybatis mapper动态代理方式
- UCloud科创板上市获受理,相关文件披露重要经营信息
- Zabbix监控内存
- GoDiagram可以画节点和连线的WinForms
- 数据结构考研如何120+?
- 采集百度搜索引擎的10个经典方法
- php中文数组,php数组的定义
- 中国超级计算机之最,中国超级计算机神威太湖之光世界最快,且总量排名榜单第一...
- arcgis lisence manager 无法启动
- 新闻发布系统之增删改查
- Python数据分析实战之物流行业数据分析
- GoldWave 音频截取工具
- JVM:这次一定要搞懂字节码
- 如切如磋,如琢如磨 - 南怀瑾
- 从本地Excel文件下载数据
- DLX算法及应用(三)杀手数独
热门文章
- Python 进阶 —— 使用 map reduce
- fire.php,php代码调试利器firephp安装与使用方法分析
- python中df head_解决Python spyder显示不全df列和行的问题
- android 7.0原生动态,Android7.0适配教程,心得
- python是什么意思中文-python是什么意思中文翻译
- python编程软件哪个好-来 看看谁最适合学Python编程
- 线上python课程一般多少钱-Python在线培训课程费用是多少?值不值得报名?
- python爬虫代码-python网络爬虫源代码(可直接抓取图片)
- iphone之使用讯飞语音sdk实现语音识别功能
- python绘制动态条形图_Python 绘图与可视化 matplotlib 动态条形图 bar