spring @Scheduled 并发
一.spring定时任务配置
applicationContext.xml:红色代码部分为需要配置的部分。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:p="http://www.springframework.org/schema/p" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd">
<!-- 定时器配置 -->
<task:annotation-driven/>
<task:scheduler id="myScheduler" pool-size="5"/>
注意事项:<task:scheduler id="myScheduler" pool-size="5"/>这段配置为非必须,配置这段的原因是spring定时任务默认是单线程的。配置了这段表示不同定时任务不论是否在同一时间点执行,任务之间互不影响(即多线程执行)。但是自己还是会影响自己。下面介绍具体问题以及解决方式。
二.测试1(不加<task:scheduler id="myScheduler" pool-size="5"/>)
方法代码:
public class QuartzServiceImpl implements QuartzService {
//1.简易定时器-(每10秒执行一次,执行时间为20秒)
@Scheduled(cron = "0/10 * * * * ? ")
public void taskA() {
try {
System.out.println(DateUtils.forMatDate(new Date())+"||A任务每10秒执行一次..");
Thread.sleep(20*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//2.简易定时器-每5秒执行一次
@Scheduled(cron="0/5 * * * * ? ")
public void taskB(){
System.err.println(DateUtils.forMatDate(new Date())+"||B任务每5秒执行一次进入测试");
}
}
结果:很明显A任务和B任务会相互影响。B任务正常应该是从15秒到20秒,但是20秒的时候执行了A任务(A任务又执行了20秒),因此B任务在40秒的时候再次执行。
二.测试2(加<task:scheduler id="myScheduler" pool-size="5"/>)
方法代码:同上,这次加上了<task:scheduler id="myScheduler" pool-size="5"/>这段配置
结果:上面的配置将spirng定时任务变为多线程,因此任务之间不会相互影响了。很明显A任务不再影响B任务的执行。正常的按每隔5秒钟执行一次。但是A任务是10秒钟执行一次,按理说应该41分30秒的时候执行了一次,下一次执行应该是40秒,而这里却变为了40分00秒的执行才执行。并没有按照每隔10秒钟执行一次。这也是上面我提到的加了线程池之后自己任务的执行时间会影响自己的下次执行。
三.测试3(加@Async注解)
方法代码:两个方法上面分别加了 @Async注解-即异步执行
public class QuartzServiceImpl implements QuartzService {
//1.简易定时器-(每10秒执行一次,执行时间为20秒)
@Scheduled(cron = "0/10 * * * * ? ")
@Async
public void taskA() {
try {
System.out.println(DateUtils.forMatDate(new Date())+"||A任务每10秒执行一次..");
Thread.sleep(20*1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
//2.简易定时器-每5秒执行一次
@Scheduled(cron="0/5 * * * * ? ")
@Async
public void taskB(){
System.err.println(DateUtils.forMatDate(new Date())+"||B任务每5秒执行一次进入测试");
}
结果:结果A任务和B任务都不会影响,并且自己也不会因为自己的执行时间过长而影响自己。
A任务每10秒正常执行一次。B任务每5秒正常执行一次。
四.总结
1.简单使用定时任务测试一即可。
2.解决并发使用测试二或测试三即可(建议使用测试二)。
原因,如果你的代码真的出现了测试三的情况,即本任务的执行时间影响了本任务的下次执行,那么你应该优化你的代码,sql语句等。而不是,让程序一直"欠费"的执行下去。
spring @Scheduled 并发的更多相关文章
- Spring @Scheduled应用解析
最近,遇到的一个需求,需要执行定时任务,每个一定时间需要执行某个方法 因为项目是SpringMVC的项目,所以使用的是Spring @Scheduled(由于quartz应用起来太麻烦,所以没有采用) ...
- 使用轻量级Spring @Scheduled注解执行定时任务
WEB项目中需要加入一个定时执行任务,可以使用Quartz来实现,由于项目就一个定时任务,所以想简单点,不用去配置那些Quartz的配置文件,所以就采用了Spring @Scheduled注解来实现了 ...
- spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务
spring计划任务,springMvc计划任务,Spring@Scheduled,spring定时任务 >>>>>>>>>>>> ...
- 定时任务 spring @Scheduled注解
使用spring @Scheduled注解执行定时任务: 运行!!! 关于Cron表达式(转载) 表达式网站生成: http://cron.qqe2.com/ 直接点击 cronExpression ...
- Spring @Scheduled Annotation
1.Overview 这里我们将会学习Spring @Scheduled 标签,了解它是如何配置,如何设置定时任务. 关于它的使用,有两点简单的规则需要记住: ※它的方法应该是一个void返回值类型 ...
- Spring @Scheduled @Async联合实现调度任务(2017.11.28更新)
定时任务之前一直用的是quartz之类,但是注意到Spring中其实也提供了一种简单的调度注释@Scheduled,也就想尝一下鲜.. 代码示意如下: @Component @EnableSchedu ...
- spring @Scheduled注解执行定时任务
以前框架使用quartz框架执行定时调度问题. 这配置太麻烦.每个调度都需要多加在spring的配置中. 能不能减少配置的量从而提高开发效率. 最近看了看spring的 scheduled的使用注解的 ...
- quartz 框架定时任务,使用spring @Scheduled注解执行定时任务
配置quartz 在spring中需要三个jar包: quartz-1.6.5.jar.commons-collections-3.2.jar.commons-logging-1.1.jar 首先要配 ...
- 使用spring @Scheduled注解执行定时任务
以前框架使用quartz框架执行定时调度问题. 老大说这配置太麻烦.每个调度都需要多加在spring的配置中. 能不能减少配置的量从而提高开发效率. 最近看了看spring的 scheduled的使用 ...
随机推荐
- 九度OJ-第5章-图论
二.并查集 1. 例题 题目1012:畅通工程 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:10519 解决:4794 题目描述: 某省调查城镇交通状况,得到现有城镇道路统计表,表中列出 ...
- IDEA 类图功能使用方法
1. Ctrl+Shift+Alt+U显示类图,(可以选中代码中类,再按快捷键,直接进入此类的类图) 2. 在类图中,选中某类右击显示Show Implementations,弹出子类的选择框. 按S ...
- 无状态http协议上用户的身份认证
1.注册时可以使用手机短信验证码进行身份认证 2.用户每次请求不能每次都发送验证码,这时需要服务器给客户端颁发一个身份凭证(一般为一个唯一的随机数),用户每次请求时都携带身份凭证, 服务器会记录该身份 ...
- PythonStudy——高级语言 High-level programming language
高级语言 高级语言(High-level programming language)相对于机器语言(machine language,是一种指令集的体系.这种指令集,称机器码(machine code ...
- 以Windows服务方式运行ASP.NET Core程序【转载】
我们对ASP.NET Core的使用已经进行了相当一段时间了,大多数时候,我们的Web程序都是发布到Linux主机上的,当然了,偶尔也有需求要发布到Windows主机上,这样问题就来了,难道直接以控制 ...
- 记录一次mysql查询速度慢造成CPU使用率很高情况
1.某日zabbix告警,某台机器CPU使用率过高. 查看慢查询日志,看到很多sql语句都超过10秒 把sql语句拿出来放在查询窗口执行.前面加上explain就可以查看详细查询信息 playcode ...
- a small notepad++ plugin to support doxygen 1key generate
Precondition: doxygen in c:\ folder testdoxygen.bat --- path %path%;C:\Doxygen;C:\Doxygen\graphviz\b ...
- Linux touch命令详解
Linux touch命令 Linux touch命令用于修改文件或者目录的时间属性,包括存取时间和更改时间.若文件不存在,系统会建立一个新的文件. 用法: touch [-acfm][-d<日 ...
- opencv的移植
一.opencv在ARM上的移植 http://www.cnblogs.com/emouse/archive/2013/04/01/2993842.html http://blog.csdn.net/ ...
- [SQL]触发器把自增ID的值赋值给另外一个字段
ALTER TRIGGER test_Rate ON dbo.tRate FOR insert AS declare @errno ) begin UPDATE dbo.tRate SET vcUpd ...