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 ...
随机推荐
- 2017 Multi-University Training Contest - Team 1—HDU6035
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6035 题意:一棵树有n个点,每个点有自己的颜色,任意两个不同的点可以组成一条路径.也就是说一共有n(n ...
- textarea文本输入区内实现换行
在文本间输入 即可成功换行 <textarea class="mytextarea">1.第一行 2.第二行 </textarea>
- where both the key and the value are strings
Environment Variables (The Java™ Tutorials > Essential Classes > The Platform Environment) htt ...
- dstat命令--检查linux系统性能
系统性能的相关工具:vmstat.netstat.iostat.ifstat. dstat命令可以查看虚拟内存.网络连接和接口.cpu活动.输入/输出设备等.
- datetime 模块详解 -- 基本的日期和时间类型
转自:https://www.cnblogs.com/fclbky/articles/4098204.html datetime 模块提供了各种类用于操作日期和时间,该模块侧重于高效率的格式化输出 在 ...
- 年假小 Plan
Learn 董伟明 课程 https://www.pycourses.com/ Learn 500 Lines or Less https://github.com/HT524/500LineorLe ...
- (0.2.4)Mysql安装——yum源安装
转自:https://www.cnblogs.com/jimboi/p/6405560.html Centos6.8通过yum安装mysql5.7 1.下载好对应版本的yum源文件 2.安装用来配置m ...
- Apache http server linux 安装过程说明
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/sundenskyqq/article/details/24733923 PS:Apache http ...
- python学习笔记(二十四)继承与封装
继承(extends)就是把多个类中相同的成员给提取出来定义到一个独立的类中,然后让这多个类和该独立的类产生一个关系,这多个类就具备了这些类容,这个关系就叫做继承. 实现继承的类称为子类,也叫派生类, ...
- centos6.8安装Discuz!X3.1(PHP论坛)
1.首先搭建apache+mysql+php环境: 一.安装 MySQL 首先来进行 MySQL 的安装.打开超级终端,输入: [root@localhost ~]# yum install mysq ...