Spring @Scheduler使用cron时的执行问题
主要想弄清使用Spring @Scheduler cron表达式时的两个问题:
- 同一定时任务,第二次触发时间到了,第一次还没有执行完成时会执行吗?
- 不同的定时任务,相互之间是否有影响?
结论写在前面:
- 同一定时任务,第二次触发时间到了,第一次还没有执行完成时会执行吗?不会,会等前一次执行完成才执行下一次
- 不同的定时任务,相互之间是否有影响?取决于可用的定时任务线程数,如果线程数足够则不会影响;如果可用定时任务线程数少于要执行定时任务数量,未能获取到线程的自然要等到有空闲线程时才能执行。
下面是实验过程。。。。。
使用Spring @Scheduler 时,默认只有一个线程,针对上面的问题,设计了3个实验:
- 设置Scheduler为多线程,设置一个线程5秒执行一次,方法体为 sleep8秒
- 使用Scheduler默认的单线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep
- 设置Scheduler为多线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep
实验一
设置Scheduler为多线程,设置一个线程5秒执行一次,方法体为 sleep8秒:
@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
log.info("test1, 5秒执行一次,每次执行sleep 8s");
Thread.sleep(8000L);
}
结果:
2017-10-11 17:49:45 scheduler-1 test1, 5秒执行一次,每次执行sleep 8
2017-10-11 17:49:55 scheduler-1 test1, 5秒执行一次,每次执行sleep 8
2017-10-11 17:50:05 scheduler-1 test1, 5秒执行一次,每次执行sleep 8
2017-10-11 17:50:15 scheduler-2 test1, 5秒执行一次,每次执行sleep 8
2017-10-11 17:50:25 scheduler-2 test1, 5秒执行一次,每次执行sleep 8
2017-10-11 17:50:35 scheduler-1 test1, 5秒执行一次,每次执行sleep 8
结论:
@Scheduled使用cron表达式,设置为多线程时,同一任务前一次没有执行完成,不会执行下一次
实验二
使用Scheduler默认的单线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep
- 如果test2每8秒执行一次,则为串行
@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
System.out.println("test1, 5秒执行一次,每次执行sleep 8s");
Thread.sleep(8000L);
}
@Scheduled(cron = "*/5 * * * * *")
public void test2() {
System.out.println("test2, 5秒执行一次,不sleep");
}
执行结果:
2017-10-11 17:17:35 test2, 5秒执行一次,不sleep
2017-10-11 17:17:35 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 17:17:43 test2, 5秒执行一次,不sleep
2017-10-11 17:17:45 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 17:17:53 test2, 5秒执行一次,不sleep
2017-10-11 17:17:55 test2, 5秒执行一次,不sleep
2017-10-11 17:17:55 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 17:18:03 test2, 5秒执行一次,不sleep
2017-10-11 17:18:05 test2, 5秒执行一次,不sleep
2017-10-11 17:18:05 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 17:18:13 test2, 5秒执行一次,不sleep
2017-10-11 17:18:15 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 17:18:23 test2, 5秒执行一次,不sleep
2017-10-11 17:18:25 test1, 5秒执行一次,每次执行sleep 8s
对比期望执行时间:
| 执行次数 | task | 期望执行时间 | 实际执行时间 |
|---|---|---|---|
| 1 | task1 | 17:17:35 | 17:17:35 |
| 1 | task2 | 17:17:35 | 17:17:35 |
| 2 | task1 | 17:17:40 | 17:17:43 |
| 2 | task2 | 17:17:40 | 17:17:45 |
结论:
@Scheduled使用cron表达式 ,配置为一个线程时,不同定时任务是串行执行,且上次没有执行完时不会执行下次
实验三
设置Scheduler为多线程,设置两个线程都是5秒执行一次,一个 sleep8秒,一个不sleep
@Scheduled(cron = "*/5 * * * * *")
public void test1() throws InterruptedException {
log.info("test1, 5秒执行一次,每次执行sleep 8s");
Thread.sleep(8000L);
}
@Scheduled(cron = "*/5 * * * * *")
public void test2() {
log.info("test2, 5秒执行一次,不sleep");
}
结果:
2017-10-11 18:12:40 scheduler-2 test2, 5秒执行一次,不sleep
2017-10-11 18:12:40 scheduler-1 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 18:12:45 scheduler-2 test2, 5秒执行一次,不sleep
2017-10-11 18:12:50 scheduler-1 test1, 5秒执行一次,每次执行sleep 8s
2017-10-11 18:12:50 scheduler-2 test2, 5秒执行一次,不sleep
2017-10-11 18:12:55 scheduler-2 test2, 5秒执行一次,不sleep
2017-10-11 18:13:00 scheduler-1 test1, 5秒执行一次,每次执行sleep 8s
对比期望执行时间:
| 执行次数 | task | 期望执行时间 | 实际执行时间 |
|---|---|---|---|
| 1 | task1 | 18:12:40 | 18:12:40 |
| 1 | task2 | 18:12:40 | 18:12:40 |
| 2 | task1 | 18:12:45 | 18:12:50 |
| 2 | task2 | 18:12:45 | 18:12:45 |
结论:
@Scheduled使用cron表达式 ,配置为多线程时,不同定时任务不是串行执行,且上次没有执行完时不会执行下次
设置定时任务为多线程
这里用的是spring boot:
@Configuration
public class ScheduleConfig {
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler scheduler = new ThreadPoolTaskScheduler();
scheduler.setPoolSize(3);
scheduler.setThreadNamePrefix("scheduler-");
return scheduler;
}
}
Spring @Scheduler使用cron时的执行问题的更多相关文章
- shiro和Spring整合使用注解时没有执行realm的doGetAuthorizationInfo回调方法的解决(XML配置)
在使用Shiro框架进行项目整合时,使用注解在使用Shiro框架进行项目整合时,使用注解在使用Shiro框架进行项目整合时,使用注解@RequiresPermissions为方法提供是需要的权限,但是 ...
- 转载:如何让spring mvc web应用启动时就执行
转载:如何让spring mvc web应用启动时就执行特定处理 http://www.cnblogs.com/yjmyzz/p/4747251.html# Spring-MVC的应用中 一.Appl ...
- Spring ——获取IOC容器时,构造方法、set方法、类方法执行顺序
1,首先,我们在ApplicationContext.xml中会写下下面类的标示: <bean id="helloword" class="com.xt.frist ...
- spring mvc web应用启动时就执行特定处理(线程启动)
package com.sdt.platform.index.controller; import java.net.URL; import java.util.List; import java.u ...
- Spring Scheduler定时任务 + Quartz
原文地址: https://blog.csdn.net/revitalizing/article/details/61420556 版权声明:本文为博主原创文章,未经博主允许不得转载. https:/ ...
- Spring 注解 @Scheduled(cron = "0 0/10 * * * ? ") 任务调度动态改变时间
不需要重启应用就可以动态的改变Cron表达式的值 import java.util.Date; import java.util.concurrent.Executor; import java.ut ...
- Quartz 用 cron 表达式存放执行计划
Quartz 用 cron 表达式存放执行计划.引用了 cron 表达式的 CronTrigger 在计划的时间里会与 job 关联上. 1.Quartz cron 表达式支持七个域如下: 名称 是否 ...
- 详解如何在 Linux 启动时自动执行命令或脚本
我一直很好奇,在启动 Linux 系统并登录的过程中到底发生了什么事情.按下开机键或启动一个虚拟机,你就启动了一系列事件,之后会进入到一个功能完备的系统中,有时,这个过程不到一分钟.当你注销或者关机时 ...
- Spring 计时器 @Scheduled cron 含义
Spring 计时器 @Scheduled cron 含义 学习:http://blog.csdn.net/prisonbreak_/article/details/49180307 http://b ...
随机推荐
- C# ArcEngine 实现点击要素高亮并弹出其属性
本文是模仿ArcMap里面的Identify(识别)功能,通过点击要素,使其高亮显示并弹出其属性表!本文只做了点击查询! 本文所用的环境为VS2010,AecEngine基于C#语言,界面是用Dev做 ...
- Django 框架之视图函数(Views)
http请求中产生的两个核心对象: http请求: HttpRequest对象 http响应: HttpResponse对象 所在位置: django.http HttpRequest 对象的属性和方 ...
- POJ1470Closest Common Ancestors 最近公共祖先LCA 的 离线算法 Tarjan
该算法的详细解释请戳: http://www.cnblogs.com/Findxiaoxun/p/3428516.html #include<cstdio> #include<alg ...
- wait_event族函数浅析
2017-06-03 周末闲暇无事,聊聊内核中的wait_event*类函数的具体实现,等待事件必定涉及到某个条件,而这些函数的区别主要是等待后唤醒的方式……直奔主题,上源码 wait_event_i ...
- 一行代码让python的运行速度提高100倍
python一直被病垢运行速度太慢,但是实际上python的执行效率并不慢,慢的是python用的解释器Cpython运行效率太差. “一行代码让python的运行速度提高100倍”这绝不是哗众取宠的 ...
- shell_01
定义变量: name='qwer' 不解析任何字符 name="qwer" 会解析$和\特殊字符 name1=123;name2=456 定义多个变量 now_date=`date ...
- 012-HQL中级2-Hive如何执行文件中的sql语句
Hive可以运行保存在文件里面的一条或多条的语句,只要用-f参数,一般情况下,保存这些Hive查询语句的文件通常用.q或者.hql后缀名,但是这不是必须的,你也可以保存你想要的后缀名.假设test文件 ...
- 【开发者笔记】解析具有合并单元格的Excel
最近公司让做各种数据表格的导入导出,就涉及到电子表格的解析,做了这么多天总结一下心得. 工具:NOPI 语言:C# 目的:因为涉及到导入到数据库,具有合并单元格的多行必然要拆分,而NPOI自动解析的时 ...
- python学习笔记(二十)初识面向对象
面向对象的编程的主要思想是把构成问题的各个事物分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描述一个事物在解决问题的过程中经历的步骤和行为.对象作为程序的基本单位,将程序和数据封装其中, ...
- Linux环境下Netstat与PS的使用
Linux下用netstat查看网络状态.端口状态 在linux一般使用netstat 来查看系统端口使用情况步. netstat命令是一个监控TCP/IP网络的非常有用的工具,它可以显示路由表.实际 ...