- 浏览: 1052705 次
- 性别:
- 来自: 郑州
文章分类
- 全部博客 (605)
- 数据挖掘 (22)
- spring (40)
- 工具使用 (39)
- java (137)
- JavaScript (40)
- webwork (12)
- web (120)
- 资源 (7)
- SSH (5)
- oracle (20)
- J2ME (1)
- 环境配置 (37)
- 项目管理 (29)
- mysql (14)
- struts (4)
- 项目总结 (27)
- ibatis学习 (33)
- 学习计划 (2)
- 缓存 (7)
- 重构 (3)
- Android (1)
- jquery (12)
- UML (3)
- 用户体验 (4)
- 习惯 (7)
- sakai (1)
- urlrewrite (4)
- rss (5)
- C plus plus (5)
- 算法 (5)
- 海量数据处理 (7)
- office(word、excel) (1)
- 面试题 (3)
- solr (8)
- 大数据 (2)
最新评论
-
hujin19861102:
截图看不见,最后一个webwrok的配置看不见
Ext+Webwork+Json 实现分页表格查询效果 -
蜗牛笔:
弱弱的问一句,要是分出来的词在词典中没有,那么两部分的pos- ...
ICTCLAS 中科院分词系统 -
weipeng1986:
授人予鱼不如授人予鱼,我想问你的是你是怎么总结的。比如第四种情 ...
JAVA中字符串连接效率的测试 -
xiaoqiang2008:
执行两次的原因是什么,好像楼主没弄清楚啊!是不是在web.xm ...
关于Spring中用quartz定时器在定时到达时同时执行两次的问题 -
Kent_Mu:
...
ibatis-dynamic的用法
问题:
周日,公司CTO给我打电话说,监控系统的数据从下午1点就不更新了。我登录服务器排除了数据同步问题,查看日志也没有例外抛出,查询了前一天的日志发现几个数据库表空间溢出例外。最后定位,Spring定时任务挂掉了。重启应用恢复正常。周一早上,同样的问题又发生了,6点开始定时任务又停了。Spring定时任务为什么会被阻塞呢?
原因:
周一中午,我在进行接口状态监控测试时发现,接口状态查询任务尽然会执行半小时。问题找到了,由于我在接口状态查询任务中没有设置读超时、在接口网络繁忙时,接口状态查询任务会占用很长的时间,Spring定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行。接口状态查询任务每5分钟执行一次,假如每次都执行1小时的话,其他任务就会被阻塞。因为Quartz的线程都被接口状态查询任务占用了。其他任务只有等待。
解决方法:
1.将JobDetail的concurrent属性配置为false。不允许任务并发执行。
2.任务执行时间较长时,查找根本问题。
实验:
JobOne.java
Java代码
package test.job;
import java.util.Date;
public class JobOne {
public void execute(){
System.out.println("execute JobOne("+new Date()+")");
try {
Thread.sleep(1000000);
}catch(InterruptedException ire) {
}
}
}
package test.job;
import java.util.Date;
public class JobOne {
public void execute(){
System.out.println("execute JobOne("+new Date()+")");
try {
Thread.sleep(1000000);
}catch(InterruptedException ire) {
}
}
}
JobTwo.java
Java代码
package test.job;
import java.util.Date;
public class JobTwo {
public void execute(){
System.out.println("execute JobTwo("+new Date()+")");
}
}
package test.job;
import java.util.Date;
public class JobTwo {
public void execute(){
System.out.println("execute JobTwo("+new Date()+")");
}
}
配置文件
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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--===== jobOne =====-->
<!-- job -->
<bean id="jobOne" class="test.job.JobOne" >
</bean>
<!-- job detail -->
<bean id="jobOneDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobOne"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobOneSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobOneDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== jobTwo =====-->
<!-- job -->
<bean id="jobTwo" class="test.job.JobTwo" >
</bean>
<!-- job detail -->
<bean id="jobTwoDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobTwo"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobTwoSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobTwoDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== Schedule =====-->
<!-- schedule -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="jobOneSimpleTrigger"/>
<ref local="jobTwoSimpleTrigger"/>
</list>
</property>
</bean>
</beans>
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--===== jobOne =====-->
<!-- job -->
<bean id="jobOne" class="test.job.JobOne" >
</bean>
<!-- job detail -->
<bean id="jobOneDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobOne"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobOneSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobOneDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== jobTwo =====-->
<!-- job -->
<bean id="jobTwo" class="test.job.JobTwo" >
</bean>
<!-- job detail -->
<bean id="jobTwoDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobTwo"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobTwoSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobTwoDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== Schedule =====-->
<!-- schedule -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="jobOneSimpleTrigger"/>
<ref local="jobTwoSimpleTrigger"/>
</list>
</property>
</bean>
</beans>
MAIN类:
Java代码
package test.job;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class JobTest {
private ApplicationContext ac;
public JobTest(ApplicationContext ac) {
this.ac = ac;
}
/**
* @param args
*/
public static void main(String[] args) {
JobTest job = new JobTest(new ClassPathXmlApplicationContext("applicationContext.xml"));
}
}
package test.job;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class JobTest {
private ApplicationContext ac;
public JobTest(ApplicationContext ac) {
this.ac = ac;
}
/**
* @param args
*/
public static void main(String[] args) {
JobTest job = new JobTest(new ClassPathXmlApplicationContext("applicationContext.xml"));
}
}
测试结果:
当jobOne的concurrent为true时:
execute JobOne(Thu Jan 24 13:40:22 CST 2008)
execute JobTwo(Thu Jan 24 13:40:22 CST 2008)
execute JobOne(Thu Jan 24 13:40:22 CST 2008)
execute JobTwo(Thu Jan 24 13:40:22 CST 2008)
execute JobOne(Thu Jan 24 13:40:23 CST 2008)
execute JobTwo(Thu Jan 24 13:40:23 CST 2008)
execute JobOne(Thu Jan 24 13:40:24 CST 2008)
execute JobTwo(Thu Jan 24 13:40:24 CST 2008)
execute JobOne(Thu Jan 24 13:40:25 CST 2008)
execute JobTwo(Thu Jan 24 13:40:25 CST 2008)
execute JobOne(Thu Jan 24 13:40:26 CST 2008)
execute JobTwo(Thu Jan 24 13:40:26 CST 2008)
execute JobOne(Thu Jan 24 13:40:27 CST 2008)
execute JobTwo(Thu Jan 24 13:40:27 CST 2008)
execute JobOne(Thu Jan 24 13:40:28 CST 2008)
execute JobTwo(Thu Jan 24 13:40:28 CST 2008)
execute JobOne(Thu Jan 24 13:40:29 CST 2008)
execute JobTwo(Thu Jan 24 13:40:29 CST 2008)
execute JobOne(Thu Jan 24 13:40:31 CST 2008)
(JobOne并发执行,到这里所有任务阻塞没有信息输出,可以看出默认有10个线程,都被JobOne占用)
当jobOne的concurrent为false时:
execute JobOne(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:01 CST 2008)
execute JobTwo(Thu Jan 24 13:43:02 CST 2008)
execute JobTwo(Thu Jan 24 13:43:03 CST 2008)
execute JobTwo(Thu Jan 24 13:43:04 CST 2008)
execute JobTwo(Thu Jan 24 13:43:05 CST 2008)
execute JobTwo(Thu Jan 24 13:43:06 CST 2008)
execute JobTwo(Thu Jan 24 13:43:07 CST 2008)
execute JobTwo(Thu Jan 24 13:43:08 CST 2008)
execute JobTwo(Thu Jan 24 13:43:09 CST 2008)
(JobOne不并发执行,JobTwo不会被阻塞)
4 楼 雁行 2008-01-25 引用
我们jobdetail用的是org.springframework.scheduling.quartz.JobDetailBean
可以设置超时时间
不过从某种意义上来说,不如并发设置为false好些。
3 楼 wangrui 2008-01-24 引用
任务的时间超不超过定时器的间隔,我觉得编程时无法决定,或者说你认为它不会,实际什么情况都会发生。我这个系统运行了半年了也没出现问题。可是还是出了这样的问题。设计时还是应该好好考虑,如果任务不需要并发就将concurrent设为false比较保险。
2 楼 jones 2008-01-24 引用
implements StatefulJob使Job成为有状态的,顺序执行
1 楼 agile_boy 2008-01-24 引用
执行任务的时间不应该超过定时器的间隔吧,否则就会发生阻塞。
转载自:
http://wangrui.iteye.com/blog/159061
周日,公司CTO给我打电话说,监控系统的数据从下午1点就不更新了。我登录服务器排除了数据同步问题,查看日志也没有例外抛出,查询了前一天的日志发现几个数据库表空间溢出例外。最后定位,Spring定时任务挂掉了。重启应用恢复正常。周一早上,同样的问题又发生了,6点开始定时任务又停了。Spring定时任务为什么会被阻塞呢?
原因:
周一中午,我在进行接口状态监控测试时发现,接口状态查询任务尽然会执行半小时。问题找到了,由于我在接口状态查询任务中没有设置读超时、在接口网络繁忙时,接口状态查询任务会占用很长的时间,Spring定时任务默认都是并发执行的,不会等待上一次任务执行完毕,只要间隔时间到就会执行。接口状态查询任务每5分钟执行一次,假如每次都执行1小时的话,其他任务就会被阻塞。因为Quartz的线程都被接口状态查询任务占用了。其他任务只有等待。
解决方法:
1.将JobDetail的concurrent属性配置为false。不允许任务并发执行。
2.任务执行时间较长时,查找根本问题。
实验:
JobOne.java
Java代码
package test.job;
import java.util.Date;
public class JobOne {
public void execute(){
System.out.println("execute JobOne("+new Date()+")");
try {
Thread.sleep(1000000);
}catch(InterruptedException ire) {
}
}
}
package test.job;
import java.util.Date;
public class JobOne {
public void execute(){
System.out.println("execute JobOne("+new Date()+")");
try {
Thread.sleep(1000000);
}catch(InterruptedException ire) {
}
}
}
JobTwo.java
Java代码
package test.job;
import java.util.Date;
public class JobTwo {
public void execute(){
System.out.println("execute JobTwo("+new Date()+")");
}
}
package test.job;
import java.util.Date;
public class JobTwo {
public void execute(){
System.out.println("execute JobTwo("+new Date()+")");
}
}
配置文件
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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-
beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--===== jobOne =====-->
<!-- job -->
<bean id="jobOne" class="test.job.JobOne" >
</bean>
<!-- job detail -->
<bean id="jobOneDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobOne"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobOneSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobOneDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== jobTwo =====-->
<!-- job -->
<bean id="jobTwo" class="test.job.JobTwo" >
</bean>
<!-- job detail -->
<bean id="jobTwoDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobTwo"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobTwoSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobTwoDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== Schedule =====-->
<!-- schedule -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="jobOneSimpleTrigger"/>
<ref local="jobTwoSimpleTrigger"/>
</list>
</property>
</bean>
</beans>
<?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:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
<!--===== jobOne =====-->
<!-- job -->
<bean id="jobOne" class="test.job.JobOne" >
</bean>
<!-- job detail -->
<bean id="jobOneDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobOne"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobOneSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobOneDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== jobTwo =====-->
<!-- job -->
<bean id="jobTwo" class="test.job.JobTwo" >
</bean>
<!-- job detail -->
<bean id="jobTwoDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobTwo"/>
<property name="targetMethod" value="execute"/>
<property name="concurrent" value="true" />
</bean>
<!-- Trigger -->
<bean id="jobTwoSimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerBean">
<property name="jobDetail" ref="jobTwoDetail" />
<property name="startDelay"><value>0</value></property>
<property name="repeatInterval"><value>1000</value></property>
</bean>
<!--===== Schedule =====-->
<!-- schedule -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="jobOneSimpleTrigger"/>
<ref local="jobTwoSimpleTrigger"/>
</list>
</property>
</bean>
</beans>
MAIN类:
Java代码
package test.job;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class JobTest {
private ApplicationContext ac;
public JobTest(ApplicationContext ac) {
this.ac = ac;
}
/**
* @param args
*/
public static void main(String[] args) {
JobTest job = new JobTest(new ClassPathXmlApplicationContext("applicationContext.xml"));
}
}
package test.job;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class JobTest {
private ApplicationContext ac;
public JobTest(ApplicationContext ac) {
this.ac = ac;
}
/**
* @param args
*/
public static void main(String[] args) {
JobTest job = new JobTest(new ClassPathXmlApplicationContext("applicationContext.xml"));
}
}
测试结果:
当jobOne的concurrent为true时:
execute JobOne(Thu Jan 24 13:40:22 CST 2008)
execute JobTwo(Thu Jan 24 13:40:22 CST 2008)
execute JobOne(Thu Jan 24 13:40:22 CST 2008)
execute JobTwo(Thu Jan 24 13:40:22 CST 2008)
execute JobOne(Thu Jan 24 13:40:23 CST 2008)
execute JobTwo(Thu Jan 24 13:40:23 CST 2008)
execute JobOne(Thu Jan 24 13:40:24 CST 2008)
execute JobTwo(Thu Jan 24 13:40:24 CST 2008)
execute JobOne(Thu Jan 24 13:40:25 CST 2008)
execute JobTwo(Thu Jan 24 13:40:25 CST 2008)
execute JobOne(Thu Jan 24 13:40:26 CST 2008)
execute JobTwo(Thu Jan 24 13:40:26 CST 2008)
execute JobOne(Thu Jan 24 13:40:27 CST 2008)
execute JobTwo(Thu Jan 24 13:40:27 CST 2008)
execute JobOne(Thu Jan 24 13:40:28 CST 2008)
execute JobTwo(Thu Jan 24 13:40:28 CST 2008)
execute JobOne(Thu Jan 24 13:40:29 CST 2008)
execute JobTwo(Thu Jan 24 13:40:29 CST 2008)
execute JobOne(Thu Jan 24 13:40:31 CST 2008)
(JobOne并发执行,到这里所有任务阻塞没有信息输出,可以看出默认有10个线程,都被JobOne占用)
当jobOne的concurrent为false时:
execute JobOne(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:00 CST 2008)
execute JobTwo(Thu Jan 24 13:43:01 CST 2008)
execute JobTwo(Thu Jan 24 13:43:02 CST 2008)
execute JobTwo(Thu Jan 24 13:43:03 CST 2008)
execute JobTwo(Thu Jan 24 13:43:04 CST 2008)
execute JobTwo(Thu Jan 24 13:43:05 CST 2008)
execute JobTwo(Thu Jan 24 13:43:06 CST 2008)
execute JobTwo(Thu Jan 24 13:43:07 CST 2008)
execute JobTwo(Thu Jan 24 13:43:08 CST 2008)
execute JobTwo(Thu Jan 24 13:43:09 CST 2008)
(JobOne不并发执行,JobTwo不会被阻塞)
4 楼 雁行 2008-01-25 引用
我们jobdetail用的是org.springframework.scheduling.quartz.JobDetailBean
可以设置超时时间
不过从某种意义上来说,不如并发设置为false好些。
3 楼 wangrui 2008-01-24 引用
任务的时间超不超过定时器的间隔,我觉得编程时无法决定,或者说你认为它不会,实际什么情况都会发生。我这个系统运行了半年了也没出现问题。可是还是出了这样的问题。设计时还是应该好好考虑,如果任务不需要并发就将concurrent设为false比较保险。
2 楼 jones 2008-01-24 引用
implements StatefulJob使Job成为有状态的,顺序执行
1 楼 agile_boy 2008-01-24 引用
执行任务的时间不应该超过定时器的间隔吧,否则就会发生阻塞。
转载自:
http://wangrui.iteye.com/blog/159061
评论
1 楼
michael.softtech
2010-08-18
用statefuljob会好些,默认不支持并发。不过你这个还是有些问题,
感觉跟并发不并发关系不大。如果你的任务本来就很耗费时间,哪怕不并发,排队的话也是很慢的,跟有没有可用线程没关系。只有当任务本身是有状态的时候,才会产生这种
多并发引起的问题。如果任务没状态,那么无论是并发不并发,都和这个任务本身的执行时间有关系。
感觉跟并发不并发关系不大。如果你的任务本来就很耗费时间,哪怕不并发,排队的话也是很慢的,跟有没有可用线程没关系。只有当任务本身是有状态的时候,才会产生这种
多并发引起的问题。如果任务没状态,那么无论是并发不并发,都和这个任务本身的执行时间有关系。
发表评论
-
spring 测试框架与维护项目结合问题
2011-11-02 02:18 1177之前项目中一直用 junit进行单元测试,使用的版本一直是ju ... -
数据日志记录讨论
2011-10-26 18:51 953详情见附件中的PPT -
spring+ibatis注解方式注入
2011-10-15 17:24 1040http://www.cnblogs.com/archie20 ... -
spring 注解 简化log4j配置
2011-10-09 23:40 986http://macrochen.iteye.com/blog ... -
spring 2.5 TestContext 测试框架
2011-10-09 19:18 6305大多同事都已经养成用j ... -
spring2.5 引入资源文件的方式
2011-10-09 16:55 1085以前项目中引入 数据库 连接相关的字符串 都是使用 &l ... -
Spring 配置中的 default-lazy-init="false"
2011-09-26 18:03 1859Spring 配置中的 default-lazy-init=& ... -
webwork+spring+ibatis注解培训文档
2011-08-15 17:26 1401今天整理了 spring 注解的使用,主要是结合公司 ... -
spring包详解 (转)
2010-11-18 17:25 888spring.jar是包含有完 ... -
spring整合hessian进行远程通讯
2010-09-30 16:04 1949由于日志没有图片功能,可以访问内部论坛: host配置: 1 ... -
远程调用 - spring+rmi
2010-09-26 22:29 1232Spring提供类用于集成各种远程访问技术。这种对远程访问的支 ... -
事务处理spring
2010-03-24 22:33 1011http://www.ibm.com/developerwor ... -
在并发情况下struts2与spring 组合需要注意的问题
2010-03-24 19:53 2101在并发情况下struts2与spring 组合需要注意的问题 ... -
Spring2.0框架的事务处理
2010-03-11 22:04 1003http://www.iteye.com/topic/328 ... -
使用import简化spring的配置文件
2010-01-28 18:13 1135对于spring配置文件的编 ... -
Spring 中的数据源 转载
2010-01-25 18:17 1219http://www.blogjava.net/masen ... -
Spring事务配置的五种方式(转)
2010-01-25 17:32 828转载自: http://www.blogjava.net ... -
spring 2.5 事务属性
2010-01-25 15:59 1625spring事务的属性 转载自http://zhangli-l ... -
spring 2.5 事务管理
2010-01-25 15:57 2036spring2.5的事物管理,分为两种方式,一是基于注解方式的 ... -
事务传播属性(转)
2010-01-25 15:53 1193事务的传播行为和隔离级别[transaction behavi ...
相关推荐
在Java世界中,任务调度是十分重要的,Spring框架提供了多种定时任务实现方式,其中包括Quartz和Timer。Quartz是一款开源的作业调度框架,而Timer是Java标准库中的一个类,用于执行定时任务。这两个工具都能帮助...
Spring的定时任务基于Quartz或Spring的TaskScheduler,它们都是强大的任务调度库,可以处理复杂的定时逻辑。 Spring还提供了`@Async`注解来实现异步任务,这在处理耗时操作时非常有用。当一个方法被`@Async`标记后...
- 默认情况下,多个定时任务会串行执行。如果需要并发执行,需要增加线程池的线程数量。并发执行时,任务的执行顺序取决于线程调度,而不是特定的顺序。 5. **相同表达式的定时任务执行** - 即使多个任务具有...
"spring-quartz-master"这个文件名表明我们的示例可能基于Spring框架集成Quartz作为定时任务的调度器。Quartz是一个开源的作业调度框架,广泛用于Java应用中,它提供了强大的定时任务管理能力。 首先,让我们了解...
这个"springboot-scheduler定时任务学习demo源码"提供了一个实践示例,帮助开发者深入理解如何在Spring Boot项目中配置和使用定时任务。 首先,让我们了解Spring Boot的定时任务(Scheduler)是如何工作的。在...
本示例主要关注Spring框架的一个重要特性——定时任务(Schedule),这使得开发者能够轻松地实现周期性任务的执行,无需手动创建线程或者使用第三方库。接下来,我们将深入探讨Spring Schedule的相关知识点。 首先...
在Spring框架中集成Quartz是一个常见的任务调度解决方案,它提供了高度可配置的定时任务执行功能。Quartz是一个开源的工作调度库,可以与Java应用程序无缝集成,用于创建、调度和执行计划任务。本篇将深入探讨如何在...
在Java中,有多种实现定时任务调度的方式,包括但不限于Java内置的`java.util.Timer`类、Spring框架的`@Scheduled`注解以及Quartz库。 1. **Java内置的`java.util.Timer`和`TimerTask`**: - `Timer`类用于创建一...
Spring框架是Java开发中广泛使用的应用框架,而Quartz则是一个功能强大的作业调度库,能够帮助开发者在应用程序中实现定时任务的安排。本篇文章将深入探讨Spring如何与Quartz集成,以及它们之间的协同工作原理。 ...
Quartz和Spring是两个在...综上所述,Quartz与Spring的集成使得定时任务的管理变得更加方便和高效,同时也为应用提供了更强大的定时任务解决方案。开发者可以根据具体需求灵活配置和扩展,以满足各种复杂的调度场景。
在Spring Boot框架中,Spring Task是用于实现定时任务的一个强大工具。它允许开发者方便地创建和管理定时任务,而无需依赖外部的调度库,如Quartz或Cron。本项目利用了Spring Task的异步执行特性,以防止任务执行...
而`quartz`或`Spring Framework`中的`@Scheduled`注解则提供了一种更加优雅的方式来创建定时任务。 `@Scheduled`是Spring框架提供的一个强大注解,它可以让我们在不编写额外调度代码的情况下,直接在方法上标注以...
在Java世界里,实现定时任务的方式多种多样,包括但不限于使用Java内置的`java.util.Timer`和`java.util.concurrent.ScheduledExecutorService`,以及更流行的开源库如Quartz和Spring Scheduler。下面我们将深入探讨...
Spring框架提供了两种方式来处理定时任务:Java内置的`Timer`类和第三方库OpenSymphony的Quartz。下面将详细介绍这两种实现方式。 ### 1. Java `Timer` 类 Java `java.util.Timer` 类是Java标准库中的一个轻量级...
4. Spring Task:Spring框架内置的定时任务解决方案,包括基于ScheduledExecutorService的简单定时任务和基于Quartz的复杂定时任务。使用@Scheduled注解可以轻松地声明周期性任务。 三、Web定时器组件的实现 1. ...
这篇博客文章“定时器Quartz的应用”很可能深入探讨了如何在实际项目中利用Quartz来实现定时任务的管理。Quartz的核心概念包括作业(Job)、触发器(Trigger)以及调度器(Scheduler),它们共同构成了一个灵活的...
- **Web 应用集成**:Quartz 可以与 Spring、Struts 等 Web 框架无缝集成,方便在 Web 环境下使用。 - **分布式调度**:通过集群配置,Quartz 支持多节点间的负载均衡和故障转移。 8. **最佳实践与优化** - **...
Quartz定时器是一款开源的、功能强大的作业调度框架,它为Java应用程序提供了精确且可扩展的任务调度能力。在Java世界中,Quartz以其灵活性、稳定性和广泛的社区支持而备受推崇。2.2.1版本是Quartz的一个稳定版本,...
综上所述,Quartz-2.2及其关联的jar包为Java开发者提供了一个强大且灵活的作业调度解决方案,适用于各种规模的应用场景,从简单的定时任务到复杂的分布式调度。通过理解并熟练掌握其核心概念、新特性和最佳实践,...
虽然`Timer`和`TimerTask`满足了基础的定时需求,但在复杂场景下,如需要更精确的控制、任务间的依赖等,可以考虑使用Quartz或Spring框架的定时任务支持,它们提供了更强大的功能和更灵活的配置。 总的来说,Java的...